旗下导航:搜·么
当前位置:网站首页 > JAVA教程 > 正文

JVM中必需控制的一些参数【JAVA教程】,jvm,参数

作者:搜教程发布时间:2019-12-02分类:JAVA教程浏览:78评论:0


导读:有的同砚虽然写了一段时候Java了,然则关于JVM却不太关注。有的同砚说,参数都是团队规定好的,布置的时刻也不必我着手,关注它有什么用,而且,JVM这东西,听上去就觉...

有的同砚虽然写了一段时候 Java 了,然则关于 JVM 却不太关注。有的同砚说,参数都是团队规定好的,布置的时刻也不必我着手,关注它有什么用,而且,JVM 这东西,听上去就觉得很神奇很深邃的模样,照样算了吧。

没错,布置的时刻大概用不到你亲自着手,然则出现问题了怎么办,岂非不必你处理问题吗,假如对 JVM 相识不够的话,有些问题大概排查起来就很辛苦,或许基础没法处理。

(引荐视频:java视频教程)

本篇以 JDK Hotspot 8 为背景,引见一下 JVM 的经常运用参数。发起你在做一些小项目、小 demo 的时刻,也把这些参数加上,加深印象。以我的履历来看,有些学问你刚入手下手打仗的时刻会觉得很难明白,然则没紧要,万事开头难嘛,学问点都是须要消化时候的。第一天不明白,以至过了一个月也不明白,然则总有那末一刻,你会倏忽有种恍然大悟的觉得,觉得一会儿通了。末了心内里谢谢本身在若干若干天之前能够入手下手进修并对峙进修这些学问点。

只引见一些经常运用参数,除了这些经常运用参数外,Hotspot 还供应了许多其他的参数,每个都值得精细精美。

照样要把内存模子图放在这里,轻易明白。

堆参数:

-Xms: 堆的初始值,比方 -Xmx2048,初始堆大小为 2G

-Xmx: 堆的最大值,比方 -Xmx2048M,许可最大堆内存 2G

-Xmn: 新生代大小

-XX:SurvivorRatio:Eden 区所占比例,默许是 8,也就是 80%,比方 -XX:SurvivorRatio=8

最好将 -Xms 和 -Xmx 的值设置成一样的值,如许做是为了防备跟着堆空间运用量增添,会动态的调整堆空间大小,有肯定的机能消耗,不如入手下手就设置成雷同的值,来躲避机能丧失。

栈参数

-Xss:栈空间大小,栈是线程独有的,所以是一个线程运用栈空间的大小,比方 -Xss256K,假如不设置此参数,默许值是 1M,平常来说设置成 256K 就足够了。

Metaspace 参数

-XX:MetaspaceSize:Metaspace 空间初始大小,假如不设置的话,默许是20.79M,这个初始大小是触发初次 Metaspace Full GC 的阈值,比方 -XX:MetaspaceSize=256M

-XX:MaxMetaspaceSize:Metaspace 最大值,默许不限定大小,然则线上环境发起设置,比方

-XX:MaxMetaspaceSize=256M

-XX:MinMetaspaceFreeRatio:最小余暇比,当 Metaspace 发作 GC 后,会盘算 Metaspace 的余暇比,假如余暇比(余暇空间/当前 Metaspace 大小)小于此值,就会触发 Metaspace 扩容。默许值是 40 ,也就是 40%,比方 -XX:MinMetaspaceFreeRatio=40

-XX:MaxMetaspaceFreeRatio:最大余暇比,当 Metaspace 发作 GC 后,会盘算 Metaspace 的余暇比,假如余暇比(余暇空间/当前 Metaspace 大小)大于此值,就会触发 Metaspace 开释空间。默许值是 70 ,也就是 70%,比方 -XX:MaxMetaspaceFreeRatio=70

发起将 MetaspaceSize 和 MaxMetaspaceSize 设置为一样大小,防止频仍扩容。

GC 日记

简朴日记

-verbose:gc 或许 -XX:+PrintGC

日记花样:

[GC (Allocation Failure)  7892K->5646K(19456K), 0.0060442 secs]
[GC (Allocation Failure) , 0.0066315 secs]
[Full GC (Allocation Failure)  19302K->13646K(19456K), 0.0032698 secs]

细致日记

#打印细致日记
-XX:+PrintGCDetails
#打印 GC 的时候点
-XX:+PrintGCDateStamps

日记花样:

2019-11-13T14:06:46.099-0800: [GC (Allocation Failure) 2019-11-13T14:06:46.099-0800: [DefNew (promotion failed) : 9180K->9157K(9216K), 0.0084297 secs]2019-11-13T14:06:46.107-0800: [Tenured: 10145K->10145K(10240K), 0.0035768 secs] 13802K->13646K(19456K), [Metaspace: 3895K->3895K(1056768K)], 0.0120887 secs] [Times: user=0.00 sys=0.00, real=0.02 secs] 
2019-11-13T14:06:47.243-0800: [Full GC (Allocation Failure) 2019-11-13T14:06:47.244-0800: [Tenured: 10145K->10145K(10240K), 0.0042686 secs] 19304K->19146K(19456K), [Metaspace: 3895K->3895K(1056768K)], 0.0043232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

以下几个 GC 日记相干的参数打印的内容比较多,生产环境可选择性开启,大多数时刻不须要开启。

GC 前后的堆信息

-XX:+PrintHeapAtGC

{Heap before GC invocations=0 (full 0):
 def new generation   total 9216K, used 7892K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)
  eden space 8192K,  96% used [0x00000007bec00000, 0x00000007bf3b5200, 
  xxx....
  class space    used 445K, capacity 462K, committed 512K, reserved 1048576K
Heap after GC invocations=1 (full 0):
 def new generation   total 9216K, used 1023K [0x00000007bec00000,
 xxx...
 Metaspace       used 3892K, capacity 4646K, committed 4864K, reserved 1056768K
  class space    used 445K, capacity 462K, committed 512K, reserved 1048576K
}

GC 致使的 Stop the world 时候

-XX:+PrintGCApplicationStoppedTime

Total time for which application threads were stopped: 0.0070384 seconds, Stopping threads took: 0.0000200 seconds

加载类信息

-verbose:class

[Loaded java.net.URLClassLoader$3$1 from /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/rt.jar]

GC 前后的类加载状况

-XX:+PrintClassHistogramBeforeFullGC
-XX:+PrintClassHistogramAfterFullGC
 num     #instances         #bytes  class name
----------------------------------------------
   1:           140       19016264  [B
   2:          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/fengzheng/jvmlog/gc.log

#致命毛病日记,只要在 jvm 发作崩溃的时刻会输出
-XX:ErrorFile=/Users/fengzheng/jvmlog/hs_err_pid%p.log

堆溢出现场保留

有些毛病虽然不会致使 jvm 崩溃,然则关于效劳而言也是异常严峻的,比方stackOverflow、OutOfMemoryError,发作毛病后,保留现场信息对剖析毛病原因是至关重要的。jvm 供应了保留堆溢出现场的要领,关于 JDK 8 而言,多是 heap 溢出,也多是 Metasapce 溢出。

-XX:HeapDumpPath=/Users/fengzheng/jvmlog
-XX:+HeapDumpOnOutOfMemoryError

末了出现异常后,保留的文件花样为 java_pidxxx.hprof,pid 背面是发作溢出的历程 id,以后能够用 VisualVM、JProfiler 等东西翻开剖析。

设置垃圾接纳器范例

跟着 JDK 版本的升级,可运用的垃圾收集器范例也愈来愈多了。JDK 8 可运用的垃圾收集器有 7 种,固然有点只适用于年青代,有点只运用于老年代,JDK 8 中最新的垃圾收集器是 G1,能够用于年青代和老年代。到了 JDK 11,还出了 ZGC。

下图是 JDK 8 中可运用的垃圾收集器以及它们合营运用的关联。

Serial、ParNew、Parallel Scavenge 只适用于年青代,CMS、Serial Old、Parallel Old 只适用于老年代,而 G1 通用于年青代和老年代。连线示意它们之间可合营运用的关联,个中 CMS 和 Serial Old 连线的意义是说 Serial Old 会作为 CMS 的后预案,当 CMS 发作 Concurrent Mode Failure 时启用。

在 JDK 8 中,假如不指定垃圾收集器,默许运用参数 -XX:+UseParallelGC,新生代运用 Parallel Scavenge,老年代运用 Serial Old。

-XX:+UseSerialGC:运用 Serial + Serial Old ,运转于 client 形式下的默许设置

-XX:+UseConcMarkSweepGC:运用 ParNew+CMS+Serial Old,CMS 垃圾收集器

-XX:+UseParallelGC:Parallel Scavenge + Serial Old,JDK 8 server 形式下的默许设置

-XX:+UseParallelOldGC:Parallel Scavenge + Parallel Old

-XX:+UseG1GC:运用 G1 垃圾收集器

开启长途 JMX 监控

除了日记外,当我们须要及时检察 JVM 运转状况的时刻怎么办,固然能够到 JVM 地点效劳器用 jstack、jmap、jinfo 等东西举行检察,然则又不够直观,这时刻就须要开启 JMX 长途功用,运用 jConsole、VisualVM 等东西举行监控。或许本身开发监控平台,比方我之前就做了一个 web 版的浅易 VisualVm。无意中就做了个 web 版 JVM 监控端

开启参数以下:

-Dcom.sun.management.jmxremote
#指定 jvm 地点效劳器 ip 或域名
-Djava.rmi.server.hostname=192.168.1.1
#指定端口
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

本文来自ki4网,java教程栏目,迎接进修!

以上就是JVM中必需控制的一些参数的细致内容,更多请关注ki4网别的相干文章!

标签:jvm参数


欢迎 发表评论: