常用java虚拟机参数
一切运行都有迹可循,掌握跟踪调试参数
1.跟踪垃圾回收--读懂虚拟机日志
-XX:+PrintGC 打印gc日志
-XX:+PrintGCDetails 虚拟机在退出时打印堆的详细信息
eg:
Heap
PSYoungGen total 512K, used 0K [0x00000000fff00000, 0x0000000100000000, 0x0000000100000000)
eden space 0K, -2147483648% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff00000)
from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
to space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
ParOldGen total 19456K, used 883K [0x00000000fec00000, 0x00000000fff00000, 0x00000000fff00000)
object space 19456K, 4% used [0x00000000fec00000,0x00000000fecdce10,0x00000000fff00000)
PSPermGen total 21504K, used 3001K [0x00000000f9a00000, 0x00000000faf00000, 0x00000000fec00000)
object space 21504K, 13% used [0x00000000f9a00000,0x00000000f9cee640,0x00000000faf00000)
[0x00000000fff00000, 0x0000000100000000, 0x0000000100000000) 3个16进制表示:下界,当前上界,上界
-XX:+PrintHeapAtGC 打印全面的堆信息
-XX:+PrintGCTimeStamps 打印GC的时间,为虚拟机启动时的偏移量
2.类的加载/卸载的跟踪
可以使用参数-verbose:class
-XX:+TraceClassLoading 跟踪类的加载
-XX:+TraceClassUnloading 跟踪类的卸载
3.系统参数查看
-XX:+PrintVMOptions 打印虚拟机接受到的命令行显示参数。
eg: 控制台输出
VM option '+TraceClassLoading'
VM option '+PrintVMOptions'
-XX:+PrintCommandLineFlags 打印传递给虚拟机的显示和隐式参数,隐式参数包括:命令行、虚拟机自行启动的默认参数
eg: 控制台输出
-XX:InitialHeapSize=132318080 -XX:MaxHeapSize=2117089280 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC
4.学习堆的配置参数
-Xmx 最大可用内存
-Xms 指定初始堆内存
提示:在实际工作中,可以直接将初始堆-Xms和最大堆-Xmx设置相等。好处是可以减少程序运行时进行的垃圾回收次数。提高程序的性能。
新生代的设置
-Xmn 可以设置新生代的大小。设置一个较大的新生代会减少老年代的大小。这个参数对GC有很大影响
-XX:SurvivorRatio 用来设置新生代中eden空间和form/to空间的比例关系。含义: -XX:SurvivorRatio=eden/form=eden/to
eg:
-Xmx20m -Xms20m -Xmn7m -XX:PrintGCDetails -XX:SurvivorRatio=2
-XX:NewRatio=老年代/新生代 来设置新生代与老年代的比例
基本策略是:尽可能将对象保留在新生代,减少老年代的GC的次数,如果对象都分配在老年代,显然为后续的老年代GC埋下伏笔
参数设置图:
堆溢出处理:
Java程序运行过程中,如果堆内存不足,则有可能抛出内存溢出的错误(out of memory).简称OOM。
当发生堆内存错误时,java虚拟机提供参数有:
-XX:+HeapDumpOnOutOfMemoryError,使用此参数,可以在内存溢出时到处整个堆内存信息。配合使用的有-XX:HeapDumpPath,可以指出堆内存的存放路径
了解非堆内存的参数配置
方法区配置
在jdk1.6,jdk1.7版本中,可以使用-XX:PermSize配置初始的永久区大小,-XX:MaxPermSize配置最大永久区
在jdk1.8中,永久区被彻底删除,使用新的元数据区存放类的元数据,默认情况下,元数据区只受系统可用内存的限制。可以使用参数-XX:MaxMetaspaceSize指定永久区最大可用值,
栈配置
-Xss 参数配置java栈大小
直接内存配置
-XX:MaxDirectMemorySize 设置最大可用直接内存,如不设置,默认值为最大堆空间,当直接内存使用量达到MaxDirectMemorySize值时,就会触发垃圾回收,如果不能有效释放足够空间,直接内存溢出依然会引起系统的OOM。
注意:
访问速度:直接内存>堆内存
内存分配速度:直接内存<堆内存
Client和Server二选一,虚拟机工作模式
Client和Server模式下设置的参数可能不同,Server启动慢,因为Server模式会尝试收集更多的系统性能信息,使用更复杂的优化算法对程序进行优化。