实战JAVA虚拟机 JVM故障诊断与性能优化(三)

时间:2022-12-27 16:05:04

常用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虚拟机 JVM故障诊断与性能优化(三)

堆溢出处理:

  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模式会尝试收集更多的系统性能信息,使用更复杂的优化算法对程序进行优化。