常用Java虚拟机参数

一.跟踪调试参数
1.跟踪垃圾回收日志
-XX:+PrintGC 这个参数是用来打印虚拟机垃圾回收日志的参数,使用这个参数启动Java虚拟机后,只要遇到GC就会打印日志,如下所示:
[GC 4112K->1700K(10240K), 0.0020904 secs]
表示在GC前,堆内存使用量约为4MB,GC后,堆空间使用量为1700KB,当前可用的堆空间总和10M。最后显示的是本次GC所花费的时间。
如果需要更详细的信息,可以使用-XX:+PrintGCDetails参数,它的输出结果为:
[GC [PSYoungGen: 489K->489K(6656K)] 8605K->8621K(19968K), 0.0011721 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC [PSYoungGen: 489K->0K(6656K)] [ParOldGen: 8132K->2406K(8192K)] 8621K->2406K(14848K) [PSPermGen: 4745K->4744K(21504K)], 0.0600615 secs] [Times: user=0.06 sys=0.00, real=0.06 secs]
参数-XX:+PrintGCDetails还会是虚拟机在推出前打印堆的详细信息,详细信息描述了各个区间的使用情况。
如果需要更全面的堆信息,可以使用参数-XX:+PrintHeapAtGC。它会在每次GC前后分别打印堆的信息,就如同-XX:+PrintGCDetails的最后输出一样。
如果需要分析GC发生的时间,还可以使用-XX:+PrintGCTimesStamps参数,改参数会在每次GC发生时,额外输出GC发生的时间,该输出时间为虚拟机启动后的时间偏移量。
2.系统参数查看
参数-XX:PrintVMOptions可以在程序运行时,打印虚拟机接受到的命令行显示参数。
参数-XX:PrintCommandLineFlags可以打印传递给虚拟机的显示和隐式参数,隐式参数未必是通过命令行直接输出的,它可能是由虚拟机启动时自行设置的。
二.堆的配置参数
1.最大堆和初始堆的设置
当Java进程启动时,虚拟机就会分配一块初始堆空间,可以使用参数-Xms指定这块空间的大小。一般来说,虚拟机会尽可能维持在初始堆空间的范围内运行。但是如果初始堆空间耗尽,虚拟机将会对堆空间进行扩展,其扩展上限为最大堆空间,最大堆空间可以使用参数-Xmx指定。很多时候我们会把初始堆-Xms和最大堆-Xmx设置相等,这样的好处是可以减少程序运行时进行的垃圾回收次数,避免每次垃圾回收后重新分配内存,同时减少堆的自动扩充 ,提高程序的性能。
2.新生代的配置
参数-Xmn可以用于设置新生代的大小,设置一个较大的新生代会减小老年代的大小,这个参数对系统性能以及GC行为有很大的影响。新生代的大小一般设置为整个堆空间的1/3到1/4左右。
参数-XX:SurvivorRatio用来设置新生代中eden空间和from/to空间的比例关系,它的含义为:-XX:SurvivorRatio=eden/from=eden/to
参数-XX:NewRatio用来设置新生代与老年代的比值,如设置-XX:NewRatio=4则新生代与老年代的比值为1:4,新生代占整个堆的1/5.
3.堆溢出处理
如果我们的代码中有漏洞,导致程序运行过程中,堆内存不足,则有可能抛出内存溢出错误,即Out Of Memory(OOM),一旦发生这类问题,系统就会被迫退出。为了能够不断完善系统,避免或减少这类错误的发生,需要在发生错误时,获得尽可能多的现场信息。参数-XX:+HeapDumpOnOutOfMemoryError可以在内存溢出时导出整个堆信息,和它配合使用的还有-XX:HeapDumpPath,可以指定导出堆的存放路径。
如下参数配置 -Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
除了在发生OOM时可以导出堆信息外,虚拟机还允许在发生错误时执行一个脚本文件,用于崩溃程序的自救,报警或者通知,也可以帮助我们获得更多的系统信息。
如下参数配置 -Xmx20m -Xms5m "-XX:OnOutOfMemoryError=/printstack.bat %p"-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
三.了解非堆内存的参数配置
1.方法区设置
方法区主要存放类的元信息。在JDK1.6和JDK1.7等版本中,可以使用-XX:PermSize和-XX:MaxPermSize配置永久区大小。其中-XX:PermSize表示初始的永久区大小,-XX:MaxPermSize表示最大永久区。
在JDK1.8中,永久区被彻底移除,使用了新的元数据区来存放类的元数据。默认情况下,元数据区只受系统可用内存的限制,但依然可以使用参数-XX:MaxMetaSpaceSize指定元数据区的最大可用值。
2.栈配置:
栈是每个线程私有的内存空间。在Java虚拟机中可以使用-Xss参数指定线程的栈大小。
3.直接内存配置
直接内存也是Java程序中非常重要的组成部分,特别是NIO被广泛应用后,直接内存的使用也变得非常普遍。直接内存跳过了Java堆,使Java程序可以直接访问原生空间,因此从一定程度上加快了内存空间的访问速度。
最大可用直接内存可以使用参数-XX:MaxDirectMemorySize设置,如不设置,默认值为最大堆空间,即-Xmx。当直接内存使用量达到-XX:MaxDirectMemorySize时,就会触发垃圾回收,如果垃圾回收不能有效释放足够空间,直接内存溢出依然会引起系统的OOM。注意的是:直接内存虽然访问速度很快,但是申请空间却远远不如申请堆内存快。所以直接内存适合申请次数少,访问较频繁的场合。如果内存空间需要频繁申请,则不适合使用直接内存。
4.设置垃圾最大年龄
参数-XX:MaxTenuringThreshold设置垃圾存活最大年龄,表示新生代经过几次youngGC后进入老年代。如果设置为0的话则新生代的对象不经过Survivor区,直接进入老年代。对于老年代比较多的应用可以提高效率。如果这个值设置比较大,可以增加对象在新生代存活时间,增加在被新生代回收的概率。
5.吞掉异常信息
参数-XX:+OmitStackTraceInFastThrow意思是当jvm检测到程序在重复抛出一个异常,在执行若干次后会将异常信息吞掉,jdk1.7中默认20707次,默认开启。开启主要是出于性能的考虑,官方文档上说"服务器VM中的编译器现在为所有“冷”内置异常提供正确的堆栈回溯。 出于性能考虑,当这样的异常被抛出几次时,该方法可能被重新编译。 重新编译之后,编译器可以使用不提供堆栈跟踪的预先分配的异常来选择更快的策略。 要完全禁用预分配的异常请使用以下新标志:-XX:-OmitStackTraceInFastThrow"。





 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值