主要的jvm参数,jvm参数详解
虽然有些同学写Java已经有一段时间了,但是对JVM并不太关注。有同学说参数是团队定的,部署的时候我不用做。关注它有什么用?另外JVM听起来很神秘很深奥,还是算了吧。
是的,您可能不需要在部署过程中亲自完成,但是如果出现问题怎么办?不需要解决问题吗?如果对JVM了解不够,有些问题可能很难排除故障,或者根本无法解决。
(推荐视频:java视频教程)
本文以JDK热点8为背景,介绍了JVM的常用参数。建议你在做一些小项目和demo的时候加上这些参数,加深印象。以我的经验,有些知识你刚接触的时候会很难理解,但没关系。万事开头难,所有知识点都需要时间消化。第一天不明白,甚至一个月后也不明白,但总会有那么一瞬间,你突然有一种极乐的感觉,一下子就感觉到了。最后,我在心里感谢自己多少天前就能够开始学习,并且一直学习这些知识点。
只介绍一些常用参数。除了这些常用参数,Hotspot还提供了很多其他参数,每一个都值得研究。
或者把内存模型图放在这里,方便理解。
如何解决写爬虫IP受阻的问题?立即使用。
堆参数:
-Xms:堆的初始值,例如,-Xmx2048。初始堆大小是2G。
-Xmx:堆的最大值,例如,-Xmx2048M,允许最大堆内存2G。
-Xmn:新生代尺寸
-xx:幸存者比例:伊甸区比例默认为8,为80%,例如-XX:SurvivorRatio=8。
栈参数
-Xss:堆栈空间大小。Stack是线程独占的,所以是一个线程使用的堆栈空间的大小,例如,-Xss256K。如果不设置该参数,默认值为1M,一般设置为256K就足够了。
Metaspace 参数
-xx:元空间大小:元空间的初始大小,如果没有设置,默认为20.79M,这是触发第一次元空间全GC的阈值,例如,-XX:元空间大小=256M。
-xx:maxmetaspace size:metaspace的最大值,默认情况下不受限制,但建议用于在线环境,如
-XX:MaxMetaspaceSize=256M
-XX:MinMetaspaceFreeRatio:最小空闲率。当元空间中发生GC时,将计算元空间的空闲率。如果空闲率(空闲空间/当前元空间大小)小于该值,将触发元空间的扩展。默认值为40,即40%,例如-XX:MinMetaspaceFreeRatio=40。
-XX:MaxMetaspaceFreeRatio:最大空闲率。当元空间中发生GC时,将计算元空间的空闲率。如果空闲率(可用空间/当前元空间大小)大于该值,将触发元空间释放空间。默认值为70,即70%,例如-XX:MaxMetaspaceFreeRatio=70。
GC 日志
简单日志
-verbose:gc或-XX: PrintGC
日志格式:
[GC(分配失败)7892K-5646K(19456K),0.0060442秒]
[GC(分配失败),0.0066315秒]
[完整GC(分配失败)19302k-13646k (19456k),0.0032698秒]详细日志
#打印详细日志
-XX:打印详细信息
#打印GC的时间点
-XX:printgdatestaps日志格式:
2019-11-13t 14:06:46.099-0800:[GC(分配失败)2019-11-13t 14:06:46.099-0800:[def new(提升失败):9180K-9157K(9216K),0.0084297 secs]2019-11-13t 14:06:46.107-0800:[tenure
2019-11-13t 14:06:47.243-0800:[完全GC(分配失败)2019-11-13t 14:06:47.244-0800:[Tenured:10145k-10145k(10240k),0.0042686 secs]19304k-19146k(19456k),[metaspace:38990
垃圾收集前后的堆信息
-XX: PrintHeapAtGC
GC调用前堆=0(满0):
def新一代总计9216K,已用7892K [0x00000007bec00000,0x 0000007 BF 600000,0x 0000007 BF 600000]
伊甸园空间8192K,96%已用[0x00000007bec00000,0x00000007bf3b5200,
xxx.
使用的类空间445K,容量462K,提交的512K,保留的1048576K
GC调用后堆=1(满0):
def新一代总计9216K,用了1023K [0x00000007bec00000,
xxx.
元空间使用了3892K,容量4646K,提交了4864K,保留了1056768K
使用的类空间445K,容量462K,提交的512K,保留的1048576K
}停止GC导致的世界时间
-XX:printgapplicationstoppedtime
应用程序线程停止的总时间:0.0070384秒,停止线程花费了:0.000200秒来加载类信息。
-verbose:class
[loaded Java . net . URL Class loader $ 3 $ 1 from/library/Java/javavirtualmachines/JDK 1 . 8 . 0 _ 111.jdk/contents/home/JRE/lib/rt.jar]GC前后的类加载
-XX:printclashistogrambefullgc
-XX:printclashistogramafterfullgc数量#实例数#字节类名
-
19016264 [B
2853 226256 [C
3: 138 169072 [I
4: 761 86240 java.lang.Class
5: 2850 68400 java.lang.String
6:660 41024[ljava . lang . object;将日志输出到文件
以上参数配置完成后,会输出到控制台或者服务默认指定的统一日志位置。但是,也会有一般信息日志、错误日志等。服务的一部分。如果混在一起就乱了。因此,jvm日志通常是分开存储的。
#GC活动日志,根据配置的参数输出内容
-Xloggc:/Users/郑风/jvmlog/gc.log
#致命错误日志,只有在jvm崩溃时才会输出。
-xx:error file=/users/郑风/jvmlog/hs _ err _ PID% p.log堆溢出字段保留
虽然有些错误不会导致jvm崩溃,但是对于服务来说也是非常严重的,比如stackOverflow和OutOfMemoryError。发生错误后,保留现场信息以分析错误原因至关重要。Jvm提供了一种保持堆溢出站点的方法,对于JDK 8来说可能是堆溢出或者Metasapce溢出。
-XX:HeapDumpPath=/Users/郑风/jvmlog
-xx:Heapdumponoffmemoryerror发生最后一个异常后,保存的文件格式是java_pidxxx.hprof,pid后面是溢出进程id。之后可以用VisualVM、JProfiler等工具打开分析。
设置垃圾回收器类型
随着JDK版本的升级,越来越多类型的垃圾收集器可用。JDK有七种垃圾收集器。当然,有些只适合年轻一代,有些只适合老一代。JDK 8最新的垃圾收集器是G1,年轻一代和老一代都可以用。当我们到达JDK 11号时,ZGC出来了。
下图显示了可以在JDK 8中使用的垃圾收集器以及它们之间的关系。
串行、ParNew、并行清除只适用于年轻一代,CMS、串行旧、并行旧只适用于年长一代,而G1一般适用于年轻一代和年长一代。这种连接意味着它们可以一起使用。CMS和Serial Old之间的连接意味着Serial Old将被用作CMS的后计划,并将在CMS出现并发模式故障时启用。
在JDK 8中,如果没有指定垃圾收集器,默认使用参数-XX: UseParallelGC,新一代使用parallelscape,老一代使用Serial Old。
-XX: UseSerialGC:使用serial old,这是客户端模式下的默认设置。
-XX:useconcmasweepgc:使用ParNew CMS Serial Old,CMS垃圾收集器。
-xx:use parallelism:parallelism serial old,JDK 8服务器模式中的默认设置。
-XX: UseParallelOldGC:并行清除并行旧
-XX: UseG1GC:使用G1垃圾收集器。
开启远程 JMX 监控
除了日志,在需要实时查看JVM运行状态的时候,我们应该怎么做?当然,我们可以去JVM所在的服务器,用jstack、jmap、jinfo等工具检查一下,但是不够直观。这时候我们需要开启JMX远程功能,使用jConsole、VisualVM等工具进行监控。或者开发自己的监控平台。比如我之前做过一个简单的web版VisualVm。无意中做了一个web版的JVM monitor。
打开参数如下:
-Dcom.sun.management.jmxremote
#指定jvm所在服务器的ip或域名。
-DJ ava . RMI . server . hostname=192 . 168 . 1 . 1
#指定端口
-DCOM . sun . management . JMX remote . port=9999
-DCOM . sun . management . JMX remote . RMI . port=9999
-DCOM . sun . management . JMX remote . authenticate=false
-DCOM . sun . management . JMX remote . SSL=false本文来自我们,java教程专栏,欢迎学习!这些是JVM中必须掌握的一些参数的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。