| |
java 虚拟机--新生代与老年代GC 1. Java堆中各代分布:
图1:Java堆中各代分布 Young:主要是用来存放新生的对象。 Old:主要存放应用程序中生命周期长的内存对象。 Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域. 它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
2. JVM 使用的GC算法是什么? 分代收集。 即将内存分为几个区域,将不同生命周期的对象放在不同区域里; 在GC收集的时候,频繁收集生命周期短的区域(Young area); 比较少的收集生命周期比较长的区域(Old area); 基本不收集的永久区(Perm area)。
3. GC 和 Full GC 有什么区别? GC(或Minor GC):收集 生命周期短的区域(Young area)。 Full GC (或Major GC):收集生命周期短的区域(Young area)和生命周期比较长的区域(Old area)对整个堆进行垃圾收集。 他们的收集算法不同,所以使用的时间也不同。 GC 效率也会比较高,我们要尽量减少 Full GC 的次数。 当显示调用System.gc() 时,gc does a full collection(both young generation and tenured generation).
4. Minor GC后,Eden是空的吗? 是的,Minor GC会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到Old generation 中。
5. Garbage collection options(JDK1.4): 图2:GC参数 堆设置 -XX:+HandlePromotionFailure 老年代分配担保(true or false) 并行收集器设置
6. 例子:Heap size 设置 场景:在JAVA_HOME下demo/jfc/SwingSet2/目录下执行下面的命令: java -jar -Xmn4m -Xms16m -Xmx16m SwingSet2.jar 系统输出:
调优:将-Xms和-Xmx选项设置为32m,而-Xmn为1/4的-Xmx值。 结果:执行java -jar ?Xmn8m ?Xms32m -Xmx32m SwingSet2.jar,系统正常运行。
7. JVM Runtime Data Area(运行时数据区): 图3:JVM运行时数据区(一) Heap: JVM只有一个为所有线程所共享的堆,所有的类实例和数组都是在堆中创建的。 Method area: JVM只有一个为所有的线程所共享的方法区。它存储类结构,例如运行时常量池,成员和方法数据以及方法、构造方法的代码。 Java Stacks:每个JVM线程拥有一个私有的栈。 Pc registers: JVM可以同时支持运行多个线程,因此每个线程需要各自的PC(program counter)寄存器。 Native method stacks: 保存native方法进入区域的地址 。
图4:JVM运行时数据区(二) Heap和Method area被所有线程共享,其生存期和JVM的生存期相同;Java Stacks、Pc registers、Native method stacks被每个线程独自拥有,其生存期和线程的生存期相同。
8. 常见的内存泄露错误
9. 参考资料:
1. A brief history of garbage collection ? http://www-128.ibm.com/developerworks/java/library/j-jtp10283/ 2. Garbage collection in the HotSpot JVM ? http://www-128.ibm.com/developerworks/java/library/j-jtp11253/ 3. Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html 4. Diagnosing a GC problem ? http://java.sun.com/docs/hotspot/gc1.4.2/example.html
Full GC 日志 -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:-HandlePromotionFailure -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps |
java 虚拟机--新生代与老年代GC
最新推荐文章于 2024-10-04 19:04:12 发布