文章目录
0、前言
JVM对内存的自动管理(内存分配和垃圾回收)使得Java程序员可以较少地关注JVM的内存状态,更过地专注于系统的业务逻辑开发。然而这一优势也带来了一定的弊端,Java程序员对内存的控制程度是比较弱的,系统状态一旦发生异常,异常的原因查找及定位相对来说成本就比较高,这就要求程序员和运维人员能够通过一定的方法在JVM运行前合理配置,运行中有效观察,保证一个服务的可用性与稳定性。
"一定的方法"就是指JVM相关的参数。笔者通过本文,和读者朋友讨论JVM参数及其含义,并附一个JVM调优的案例,辅以相关参数的说明。
1、JVM参数
1.1、JVM堆参数
参数名称 | 含义 | 默认值 | 说明 |
---|---|---|---|
-Xms | 初始堆大小 | 物理内存的1/64(<1GB) | 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。 |
-Xmx | 最大堆大小 | 物理内存的1/4(<1GB) | 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。 |
-Xmn(-XX:MaxNewSize) | 年轻代最大值 | 此处的大小是(eden+ 2 survivor space),与jmap -heap中显示的New gen是不同的。 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。增大年轻代后,将会减小年老代大小。 此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 |
|
-XX:NewSize | 设置年轻代初始化内存 | ||
-XX:MaxNewSize | 年轻代最大值 | ||
-XX:PermSize | 持久代(perm gen)初始值 | 物理内存的1/64 | |
-XX:MaxPermSize | 设置持久代最大值 | 物理内存的1/4 | |
-Xss | 每个线程的堆栈大小 | JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。 在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 一般小的应用, 如果栈不是很深, 应该是128k够用的。大的应用建议使用256k。 这个选项对性能影响比较大,需要严格的测试。 和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"” -Xss is translated in a VM flag named ThreadStackSize” 一般设置这个值就可以了。 |
|
-XX |