引言: JVM分析和优化是Java技术体系中的高大上的内容,其实这个东西没有那么神秘和高深,只是大部分童鞋没有机会真正接触它们,从而对它们有一个深入理解。这里通过一个小题目,来展示如何来看JVM输出的日志信息,并得出JVM几个设置变量的设置信息。
1. 题目的提出,请分析最有可能的JVM的参数设置。
Heap
def new generation total 6464K, used 115K [0x34e80000,0x35580000, 0x35580000)
eden space 5760K, 2% used[0x34e80000, 0x34e9cd38, 0x35420000)
from space 704K, 0% used[0x354d0000, 0x354d0000, 0x35580000)
to space 704K, 0% used [0x35420000, 0x35420000, 0x354d0000)
tenured generation total 18124K, used 8277K [0x35580000,0x36733000, 0x37680000)
the space 18124K, 45% used[0x35580000, 0x35d95758, 0x35d95800, 0x36733000)
compacting perm gen total 16384K, used 16383K [0x37680000,0x38680000, 0x38680000)
the space 16384K, 99% used[0x37680000, 0x3867ffc0, 0x38680000, 0x38680000)
ro space 10240K, 44% used[0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
rw space 12288K, 52% used [0x39080000, 0x396cdd28, 0x396cde00,0x39c80000)
2. JVM参数分析 2.1 -XX:+PrintGCDetails
由于JVM需要打印出详细的GC回收和内存分布信息,故需要设置此变量
2.2 -Xmx 最大堆空间设置
def new generation为新生代的信息, tenured generation 代表的是年老代的信息。 其目前使用分配空间为6M. [0x34e80000,0x35580000, 0x35580000): 分别代表最小地址,当前分配的空间地址,最大的空间地址。当前使用的空间是6M + 18M = 24M.
由于x34e80000~~0x376800000之间分配的空间为40M,故当前的分配的空间不是设置的最大空间值,所以可知其设置了最大的内容空间,而且其最大空间xmx和最小空间xms不是一致的。
故其-Xmx40M. 其无法得知是否已经设置xmx。
2.3 -Xmn年轻带空间设置
分析def new generation的信息,当前内存使用情况6464k, eden space 5760k, from/to space: 704k. 其最大空间地址和当前的地址空间位置一样:0x35580000,但是目前使用的内存并未完全使用完毕,故可推测知道,其设置年轻带的内存大小。
其最大空间地址0x35580000 - 最小空间地址0x34e80000 = 7M. 故其-Xmn为7M.
2.4 maxpermsize
compacting perm gen表示永久代的信息,存放class信息,静态方法和变量,常量信息等。 其最大空间地址和当前空间地址一样,故可知其内存已经被全部分配了。另外,从使用率99%可知,基本使用完毕了。
其最大空间地址0x38680000 - 最小空间地址0x37680000 = 16.7M. 故可知其最大的PermSize已经设置过了,但无法得知其初始设置的permsize大小。
-XX:maxpermsize=17M.
3. 总结
以上的文本示例来自于JVM中的内存分配片段,通过以上的分析,可以帮助大家来了解当前的内存状态信息,从而可以利用以上信息,来进行JVM的优化和调优。
JVM参数: -Xmx40M -Xmn7M -XX:maxpermsize=17M -XX:+PrintGCDetails verbose:gc