垃圾回收跟踪参数
-XX:+PrintGC 打印GC日志,精简
-XX:+PrintGCDetails 打印GC日志详细信息
-XX:+PrintHeapAtGC 在每次GC前后分别打印堆的信息
-XX:+PrintGCApplicationCurrentTime 打印应用程序执行之间
-XX:+PrintGCApplicationStoppedTime 打印应用程序由于GC而产生的停顿时间
-XX:+PrintGCRefferenceGC 跟踪系统内的软应用、弱引用、虚引用和Finallize队列
类加载和卸载的跟踪
-verbose:class 跟踪类的加载和卸载
-XX:+TraceClassLoading 单独跟踪类的加载
-XX:+TraceClassUnloading 单独跟踪类的卸载
系统参数查看
-XX:+PrintVMOptions 打印虚拟机命令行接受的显示参数
-XX:+PrintCommandLineFlags 打印虚拟机的显示和隐式参数,隐式参数未必是通过命令行给出的,可能是由虚拟机启动时自行设置的
-XX:+PrintFlagsFinal 打印所有的系统参数
堆得配置参数
-Xmx 指定堆得最大值,例如,-Xmx20M设置堆得最大值为20M
-XX:MaxHeapSize 指定堆的最大值,例如,-XX:MaxHeapSize=20M
-Xms 与-XX:InitialHeapSize 两种方式指定堆的初始大小
提示:在实际工作中,可以直接讲初始堆-Xms和最大堆-Xmx设置相等。这样的好处可以减少程序运行时进行的垃圾回收次数,从而提高程序的新能。
新生代的配置
-Xmn 用于设置新生代的大小,设置一个较大的新生代会减少老年代的大小,新生代的大小一般设置为整个堆空间的1/3或者1/4左右
-XX:SurvivorRatio 用来设置新生代空间和from/to空间的比例关系 eden/from=eden/to
-XX:NewRatio 用来设置老年代和新生代的比例关系 老年代/新生代
堆溢出排查参数配置
-XX:+HeapDumpOnOutOfMemoryError 在内存溢出是到处整个堆信息
-XX:HeapDumpPath 指定导出堆的存放路径
在发生堆溢出时可以导出堆信息外,虚拟机还允许在发生错误是执行一个脚本文件。该文件可以用于崩溃程序的自救、报警和通知,也可以帮助开发人员获得更多的系统信息,如完整的线程转储。
例如:C:/Program Files/JAVA/javaSE1.8/jdk1.8/bin/jstack -F %1 > D:/06Log/JVM/gc/jstack.txt 导出java虚拟机进程的线程信息,并保存到jstack.txt文件中。
参数设置如:-Xmx20M -Xms5M "-XX:OnOutOfMemoryError=C:/Program Files/JAVA/javaSE1.8/jdk1.8/tools/printstack.bat %p" -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/06Log/JVM/gc/a.dump
非堆内存参数配置
方法区配置:
JDK1.7以前版本,可以使用-XX:PermSize 和 -XX:MaxPermSize配置永久区的大小。
-XX:PermSize 初始永久区大小
-XX:MaxPermSize 最大永久区大小
JKD1.8中,永久区被彻底移除,使用了新的元数据区存放类的元数据。默认情况下,元数据区只受系统可用内存的限制,但依然可以使用参数-XX:MaxMetaspaceSize指定永久区的最大可用值。
栈配置
-Xss 设置线程栈的大小
直接内存配置
-XX:MaxDirectMemorySize
直接内存也是Java程序中非常重要的组成部分,特别是在NIO被广泛使用后,直接内存的使用也变得非常普遍。直接内存跳过了Java堆,使Java程序可以直接访问原生堆空间,因此,从一定程度上加快了内存空间的访问速度。但是,武断的认为使用直接内存一定可以提高内存访问速度也是不正确的。最大可用直接内存可以使用参数-XX:MaxDirectMemorySize设置,如不设置,默认值为最大堆空间,即-Xmx。当直接内存使用量达到最大直接内存时,就会触发垃圾回收,如果垃圾回收不能有效的释放足够的空间,直接内存溢出依然会引起系统的OOM。
在访问读写直接内存比堆内存快,在申请空间时,堆空间的速度远远高于直接内存。所以,直接内存适合申请次数少,访问比较频繁的场合。如果内存空间需要频繁申请,则并不适合使用直接内存。