Java虚拟机参数

1、GC参数

        -XX:+PrintGC,使用这个参数启动Java虚拟机后,遇到GC就会打印日志。

       日志显示,一共进行了4次GC,GC前后的堆空间使用量分别为4MB左右和377KB,当前可用堆最大内存约为16MB,最后显示的是本次GC花费的时间。

        -XX:+PrintGCDetails,打印更详细的GC信息,还会使虚拟机在退出前打印堆的详细信息。

         系统经历了3次GC,第1次是新生代GC,新生代从回收前的8MB左右降低到1MB,整个堆从22MB左右降低到17MB;第2次是Full GC,同时回收了新生代、老年代和永久区,新生代没有释放空间(GC日志的Bug),老年代从16MB降到13MB,整个堆从26MB降到13MB(推出新圣地实际上已被清空),永久代的大小没有变化,最后显示GC花费的时间,user表示用户态CPU耗时,sys表示系统CPU耗时,real表示GC实际经历的时间;第3次GC后,虚拟机退出并打印当前堆的各区间使用情况,新生代总大小为9792KB,已使用4586KB,紧随其后的3个16进制数字表示新生代的下界、当前上界和上界,上界减去下界为当前堆空间的的最大值,当前上界减去下界为堆空间已使用大小,如果当前上界等于下界,说明堆空间已没有扩大的可能。

        -XX:+PrintHeapAtGC,在每次GC前后分别打印堆的信息。

        -XX:+PrintGCTimeStamps在每次GC发生时,额外输出GC的发生时间,该时间为虚拟机启动后的时间偏移量。

         系统启动后0.08s、0.088s、0.094s发生了3次GC。

        -XX:PrintGCApplicationConcurrentTime可以打印应用程序的执行时间,-XX:PrintGCApplicationStoppedTime可以打印应用程序由于GC而产生的停顿时间。

        -XX:+PrintReferenceGC可以跟踪系统的软引用、若引用、虚引用和Finallize队列。

         -Xloggc:<file>将GC日志以文件额形式输出。

2、类加载/卸载跟踪参数

        随着动态代理、AOP等技术的普遍使用,系统可能在运行时动态生成某些类,这些类无法通过文件系统找到,为此虚拟机提供了类加载、卸载跟踪参数。

        -verbose:class可以跟踪类的加载和卸载,-XX:+TraceClassLoading可以跟踪类的加载,-XX:+TraceClassUnloading跟踪类的卸载。

        -XX:+PrintClassHistogram可以在运行时打印系统中类的分布情况,只要在Java控制台中按下Crtl+Break组合键,就会显示当前类的信息柱状图。

        通过柱状图,可以看出当前系统中占用空间最多的对象、及其实例数量和空间大小。

3、系统参数 

        -XX:PrintVMOptions可以在程序运行时打印虚拟机接收到的命令行显式参数。

        -XX:+PrintCommandLineFlags可以打印传递给虚拟机的显式和隐式参数,隐式参数未必是由命令行给出的,可能是虚拟机启动时自行设置的。

        -XX:+PrintFlagsFinal可以打印所有的系统参数的值。

4、堆的配置参数

        Java进程启动时,虚拟机会根据-Xms的值分配一块初始堆空间,虚拟机会尽可能维持在初始堆空间的范围内运行,如果初始堆空间耗尽,虚拟机会扩展堆空间,上限为-Xmx指定的最大堆空间。实际工作中可以将初始堆-Xms和最大堆-Xmx设置相等,可以减少程序运行时的垃圾回收次数。

        由于垃圾回收的需要,虚拟机会对堆空间进行分区管理,不同区域采用不同的回收算法,一些算法会使用空间换时间的策略工作,会损失可用内存,导致实际可用内存比分配的内存小from/to区域大小的空间。

        -Xmn用于设置新生代的绝对大小,新生代大小对系统性能和GC行为影响很大,一般设置为整个堆空间的1/3或1/4。

        -XX:SurvivorRatio用于设置新生代中eden和from/to区空间的比例关系。

        -XX:NewRatio用于设置老年代和新生代的比例。

        实际工作中,应尽可能将对象预留在新生代,减少老年代GC的次数。

        在Java程序运行过程中,如果堆空间不足,可能抛出内存溢出错误(Out Of Memory),简称OOM。

         -XX:+HeapDumpOnOutOfMemoryError可以在内存溢出时导出整个堆信息,-XX:HeapDumpPath可以指定导出堆的存放路径。

        发生OOM时,除了导出堆信息外,虚拟机还允许执行一个脚本文件用于崩溃程序的自救、告警或通知,也可以获取完整的线程转存(Thread Dump)文件。脚本如下:

        该脚本用于导出虚拟机进程的线程信息,并保存在a.txt文件中。使用如下参数执行上述脚本:

 5、方法区配置参数

        JDK 1.6和JDK 1.7中,可以使用-XX:PermSize配置初始的永久区大小,-XX:MaxPermSize配置永久区的最大空间。

        JDK 1.8中,永久区被彻底移除,使用云数据区存放类的元数据,默认情况下,元数据区只受系统可用内存的限制,但依然可以使用参数-XX:MaxPermSize配置元数据区的最大空间。

6、栈配置参数

        -Xss指定线程的栈大小。

7、 直接内存配置

         -XX:MaxDirectMemorySize用于设置最大可用直接内存,默认为最大堆空间(-Xmx)。当直接内存使用量达到最大时,会触发垃圾回收,如果垃圾回收不能释放足够空间,直接内存溢出依然会引起系统的OOM。

        直接内存适合申请次数较少,访问较频繁的场合。

8、虚拟机工作模式参数

        目前的Java虚拟机支持Client和Server两种运行模式,使用-client和-server配置。Server模式会尝试收集更多的系统性能信息使用优化算法对程序进行优化,所以启动比Client模式慢。但系统完全启动并稳定运行后,其执行速度会远快于Client模式。Server模式适合后台长期运行的程序,Client模式适合用户界面程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值