2、jvm内存分配&参数
jvm堆中主要的空间,就是以上新生代、老生代、永久代组成,整个堆大小=新生代大小 + 老生代大小 + 永久代大小。 具体的对象提升方式,这里不再过多介绍了,我们看下一些jvm命令参数,对堆大小的指定。如果不采用以下参数进行指定的话,虚拟机会自动选择合适的值,同时也会基于系统的开销自动调整。
分代
参数
描述
堆大小
-Xms
初始堆大小,,默认为物理内存的1/64(<1GB)
-Xmx
最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
新生代
-XX:NewSize
新生代空间大小初始值
-XX:MaxNewSize
新生代空间大小最大值
-Xmn
新生代空间大小,此处的大小是(eden+2 survivor space)
永久代
-XX:PermSize
永久代空间的初始值&最小值
-XX:MaxPermSize
永久代空间的最大值
老年代
老年代的空间大小会根据新生代的大小隐式设定
初始值=-Xmx减去-XX:NewSize的值
最小值=-Xmx值减去-XX:MaxNewSize的值
在设置的时候,如果关注性能开销的话,应尽量把永久代的初始值与最大值设置为同一值,因为永久代的大小调整需要进行FullGC 才能实现。
3、计算活跃数据大小
计算活跃数据大小应该遵循以下流程:
如前所述,活跃数据应该是基于应用程序稳定阶段时,观察长期存活与对象在java堆中占用的空间大小。
计算活跃数据时应该确保以下条件发生:
1.测试时,启动参数采用jvm默认参数,不人为设置。
2.确保Full GC 发生时,应用程序正处于稳定阶段。
采用jvm默认参数启动,是为了观察应用程序在稳定阶段的所需要的内存使用。