主要的jvm参数,jvm参数详解

  主要的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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: