一,java堆是怎么一会儿事儿?
根据JVM规范, 将运行时数据区分为了PC寄存器,java虚拟机栈,堆,方法区(通常作为堆的一部分),运行时常量池(在方法区中),本地方法栈. 堆被所有线程所共享,随着JVM的启动而创建,JVM的消亡而消亡.
我们常说的垃圾回收,主要指的就是回收堆的垃圾(不可达对象).但是由于不同的对象的生命周期不一样,"朝生夕死","千年王八"等等,所以为了便于高效的对堆内存进行回收,类似OSI/RM网络分层一样, 将堆分为了三块,**持久代,年老代,年轻代 ( permanent generation, tenured generation, and young generation) **
- 持久代
主要存储了一些常量,类的信息等等 - 年老代
主要存放了一些生命周期比较长的对象(由年轻代升迁),或者是比较大的对象(直接分配) - 年轻代
- 对象都主要分配到年轻代的Eden区
- 为了年轻代的垃圾手机方便,将年轻代又划分了三个区域, Eden区, from Survivor区,to Survivor区
二,Minor GC和Full GC
- 对象基本上要分配到年轻代的Eden区,当Eden区域没有足够的空间进行分配时,虚拟机将发起一次MinorGC
- 升到老年代的对象大于老年代剩余空间,或者小于时被HandlePromotionFailure参数强制Full GC. 一般情况下,出现了Full GC会伴随着Minor GC
三,一些参数设置的含义
-Xms: 初始Heap大小
-Xmx: java heap最大值
-Xmn: young generation的heap大小
-Xss: 每个线程的Stack
-XX:PermSize: 持久代最小值
-XX:MaxPermSize: 持久代最大值
-XX:NewSize: 年轻代大小
-XX:NewRatio: 年老代/年轻代比例
-XX:SurvivorRatio: 年轻代中的Eden/Survivor比例
......
参考:
1,http://www.oracle.com/technetwork/java/faq-140837.html
2,http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
3,http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html#1.1.Introduction%7Coutline
网友评论