Java垃圾收集机制 博客分类: Java javajvm
2)装载JVM.dll
3)初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
4)调用JNIENV实例装载并处理class类
三、详解Java GC的工作原理:
1、 首先来看一下JVM内存结构,它是由堆、栈等部分组成,结构图如下所示。
1)堆
所有通过new创建的对象的内存都在堆中分配。显然,如果不对堆中的这些对象内存进行分类的话,是多而杂的。在不进行对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进行回收,花费时间相对会长,同时,因为每次回收都需要遍历所有存活对象,但实际上,对于生命周期长的对象而言,这种遍历是没有效果的,因为可能进行了很多次遍历,但是他们依旧存在。因此,分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收。
年轻代:
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。
年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代:
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。
2)栈
每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。
2. JVM垃圾回收机制
针对上述的分类,GC有两种类型:Scavenge GC和Full GC。
1)Scavenge GC
一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。
(1) 年老代(Tenured)被写满
(2)持久代(Perm)被写满
(3)System.gc()被显示调用
(4)上一次GC之后Heap的各域分配策略动态变化
这,便是近日,一直在学习的,下次跟大家,分享一下,垃圾回收机制的几个算法问题吧。
上一篇: 再次问高手 linux下apache配置ssl后为何https和http都可以访问等有关问题 100分
下一篇: Extjs3综合应用(待续v4...初版) 博客分类: js EXTSpringJSPStrutsiBATIS 最近又要搞界面了。郁闷啊。
推荐阅读
-
Java垃圾收集机制 博客分类: Java javajvm
-
Java垃圾收集机制 博客分类: Java javajvm
-
Java事件处理机制- 事件监听器的四种实现方式 博客分类: J2SE学习 JavaSwingGmailCC++
-
WAS数据收集及简单CPU占用高分析 博客分类: WAS WASCPU占用高JAVA进程
-
Java并发编程-客户端加锁机制 博客分类: JAVA 客户端加锁机制
-
Java反射机制 博客分类: J2SE java设计模式spring反射DI
-
java面试之jvm垃圾回收机制 博客分类: java面试总结 jvm垃圾回收机制gc面试java
-
Java的垃圾收集机制
-
JAVA虚拟机(JVM)详细介绍(三)——垃圾收集机制
-
JAVA虚拟机(JVM)详细介绍(三)——垃圾收集机制