java 堆
java 运行时内存最为重要的部分,几乎所有的对象和数组都是在堆中分配空间的。
java 堆分为新生代和老年代两个部分,新生代用于存放刚刚产生的对象和年轻的对象,如果对象一直没有被回收,生存的足够长,对象就会被移入老年代。
堆分配参数图

新生代
新生代可以细分为:eden、survivor space0(别称s0、from space)和survivor space1(别称s1、to space)。
eden翻译后为伊甸园,是对象的出生地,大部分对象刚刚建立时,通常会存放在这里。
s0、s1翻译后为幸存者,即存放在其中的对象至少经历了一次垃圾回收,并得以幸存。如果在幸存区的对象到了指定的年龄仍未被回收,则有机会进入老年代(tenured)。
相关参数
参数名称 | 说明 | 默认值 | 备注 |
---|---|---|---|
-Xms | 初始堆大小,也可称最小堆大小 | 物理内存的1/64 | 默认空余堆内存小于40%时,JVM就会增大堆,直到-Xmx的最大限制 |
-Xmx | 最大堆大小 | 物理内存的1/4 | 默认空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制 |
-Xss | 每个线程的堆栈大小 | JDK5.0以后每个线程大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小调整。在相同物理内存大小下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用,如果栈不是很深,应该是128K够用的,大的应用建议使用256K。这个选项对性能影响比较大,需要严格的测试
|
|
-Xmn | 堆中新生代的大小 |
其他相关参数
参数名称 | 说明 | 默认值 | 备注 |
---|---|---|---|
-XX:AggressiveOpts | 加快编译 | ||
-XX:PermSize | 设置持久代(perm gen)初始值 | ||
-XX:MaxPermSize | 设置持久代最大值 | ||
-XX:DisableExplicitGC | 关闭System.gc() | 这个参数需要严格的测试 |
|
-XX:MaxTenuringThreshold | 垃圾最大年龄 | 如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代即被回收的概率,该参数只有在串行GC时才有效 | |
-XX:+UseConcMarkSweepGC | 使用CMS内存收集 | 测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置 。 |
|
-XX:+UseParNewGC | 设置年轻代为并行收集 | 可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值
|
|
-XX:+UseBiasedLocking | 锁机制的性能改善 | ||
-XX:+CMSParallelRemarkEnabled | 降低标记停顿 | ||
-XX:+UseCMSCompactAtFullCollection | 在FULL GC的时候, 对年老代的压缩 | ||
-XX:+UseFastAccessorMethods | 原始类型的快速优化 | ||
-XX:+UseCMSInitiatingOccupancyOnly | 使用手动定义初始化定义开始CMS收集 | 禁止hostspot自行触发CMS GC |
网友评论