您的位置:首页 > 其它

JVM的组成与垃圾回收机制

2018-01-21 17:24 141 查看


JVM的组成

JVM即Java Virtual Machine,Java虚拟机。它是一个虚拟的计算机,可以在实际的计算机上模拟各种计算机功能。这也是Java语言能够实现与平台无关的原因,JVM屏蔽了与具体操作平台的相关信息,JVM运行的是由源码编译形成的class文件即字节码文件。

JVM的组成包括:JVM解释器、指令系统、寄存器、栈、存储区、碎片回收区。

JVM解释器:虚拟机处理字节码的CPU

指令系统:根物理计算机相似,一条指令分为操作码+操作数。

寄存器:JVM自己的虚拟寄存器,有4个常用的寄存器:PC(程序计数器)、OPTOP(操作数栈顶指针)、FRAME(当前执行环境指针)、VARS(当前环境中第一个局部变量的指针)

栈:指令执行时数据和信息存储的位置和控制中心,为解释器提供运算所需的信息。

存储区:JVM有两种存储区:常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称、常量。方法区用于存储方法的字节码。

碎片回收区:将使用过的实力从内存回收。


垃圾回收机制

GC(Garbage Collector),GC通过确定对象是否被活动对象引用来判断是否收集该对象。


什么时候会触发GC回收一个对象?

1、对象没有引用

2、作用域发生未捕获异常

3、程序在作用域正常执行完毕

4、程序执行了System.exit()

5、程序发生意外中止(被杀进程等)

6、JVM内存不足


怎么判断一个对象没有被使用?

1、 标记数方法

给每一个对象打上标记,对象被引用一次,计数+1;释放对象,计数-1,当标记计数为0时,对象就能收回了。

但是,这种方法存在缺陷,例如,当两个对象相互引用,除此之外两个对象都没有其他引用的引用,说明这两个对象已经是垃圾了,但是两个对象的计数都是1,不能被回收。

2、根搜索方法

从根节点开始搜索其对应的引用节点,找到这个节点后,在接着找这个节点对应的引用节点,当所有的引用节点寻找完毕后,剩余的节点就被认为是无用节点。


两个重要方法

System.gc()

使用System.gc(),不管JVM使用的哪一种垃圾回收算法,都可以请求Java的垃圾回收。

finalize()

JVM垃圾回收器回收一个对象之前,一般要求程序调用适当的方法释放资源,在没有明确资源释放的情况下,finalize()使用缺省机制来释放资源。在对象执行了finalize()后,对象消失,垃圾回收开始执行。

为什么还要使用finalize()呢,因为有些情况垃圾回收器无法处理:一、当内存分配中采用了像C语言那种申请释放机制时,垃圾回收器无法直接回收;二、程序申请的一些资源,例如:文件、设备等,这些资源不在垃圾回收的范围。


垃圾回收算法

1、标记-清除算法

该算法是垃圾回收最基础的算法,分为标记阶段和清除阶段。标记阶段是标记出要回收的对象,清除阶段是回收被标记对象的空间。

存在的缺陷:容易产生大量内存碎片。

2、复制算法

为了解决标记-清除算法的缺陷,提出来了复制算法,该算法将内存分为大小相等的两块,每次只使用其中一块,当一块内存空间用完之后,就将还存活的对象复制到另一块上,同时清理上一块上的空间,解决了内存碎片的问题。

存在的缺陷:需要大量的内存空间。

3、标记-整理算法

标记阶段跟标记-清除算法一致,标记过后,整理过程是将存活对象移动到内存一端,清理掉端边界以外的对象。

4、分代算法

分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代新生代,老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。

对于新生代,主要采用复制算法,由于新生代大部分都会被回收,所以复制的次数比较少,但是并不是严格按照1:1的比例来划分新生代空间的。

对于老年代,主要采用标记-整理算法来处理。

此外,还有永久代,也被称为“方法区”。


如何减少垃圾回收的开销

1、不要显式调用System.gc();

2、尽量减少临时对象的使用;

3、对象不用时最好显式置为Null;

4、尽量使用StringBuffer,而不用String来累加字符串;

5、能用基本类型如Int,Long,就不用Integer,Long对象;

6、尽量少用静态对象变量;

7、分散对象创建或删除的时间;

参考:

http://blog.sina.com.cn/s/blog_e3b907d70101g3rc.html

https://www.cnblogs.com/wabi87547568/p/5282892.html

http://jbutton.iteye.com/blog/1569746

https://www.cnblogs.com/alphablox/archive/2013/01/12/2858042.html

http://blog.csdn.net/q291611265/article/details/45114995
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: