推荐学习

  • 阿里架构大牛说:JVM从入门到入魔,就是这么简单
  • 性能优化专题复习:JVM+Tomcat+MySQL+面试+学习笔记等

神秘的 JVM 吗

有的同学虽然写了一段时间 Java 了,但是对于 JVM 却不太关注。有的同学说,参数都是团队规定好的,部署的时候也不用我动手,关注它有什么用,而且,JVM 这东西,听上去就感觉很神秘很高深的样子,还是算了吧。

没错,部署的时候可能用不到你亲自动手,但是出现问题了怎么办,难道不用你解决问题吗,如果对 JVM 了解不够的话,有些问题可能排查起来就很费力,或者根本无法解决。

本篇以 JDK Hotspot 8 为背景,介绍一下 JVM 的常用参数。建议你在做一些小项目、小 demo 的时候,也把这些参数加上,加深印象。以我的经验来看,有些知识你刚开始接触的时候会感觉很难理解,但是没关系,万事开头难嘛,知识点都是需要消化时间的。第一天不理解,甚至过了一个月也不理解,但是总有那么一刻,你会突然有种茅塞顿开的感觉,感觉一下子通了。最后心里面感谢自己在多少多少天以前能够开始学习并坚持学习这些知识点。

只介绍一些常用参数,除了这些常用参数外,Hotspot 还提供了很多其他的参数,每一个都值得考究。

还是要把内存模型图放在这里,方便理解。

堆参数:

-Xms: 堆的初始值,例如 -Xms2048M,初始堆大小为 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 1048576KHeap 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

最后

学习 Java 一段时间之后,想要进一步提升,JVM 是你永远绕不过去的,JVM 如何工作的,如何调优,将决定你和其他开发人员的差距。别等了,赶紧学吧。

作者:古时的风筝
原文链接:https://juejin.im/post/5ecc6c216fb9a047d1126843

如何开启jvm日志_Java 从小白到大牛,JVM 不得不知的一些参数和配置相关推荐

  1. java jvm 参数配置_Java 从小白到大牛,JVM 不得不知的一些参数和配置

    神秘的 JVM 码 有的同学虽然写了一段时间 Java 了,但是对于 JVM 却不太关注.有的同学说,参数都是团队规定好的,部署的时候也不用我动手,关注它有什么用,而且,JVM 这东西,听上去就感觉很 ...

  2. dockerfile tomcat 配置jvm参数_Java 从小白到大牛,JVM 不得不知的一些参数和配置

    神秘的 JVM 码 有的同学虽然写了一段时间 Java 了,但是对于 JVM 却不太关注.有的同学说,参数都是团队规定好的,部署的时候也不用我动手,关注它有什么用,而且,JVM 这东西,听上去就感觉很 ...

  3. java jvm容器_java – YARN:容器和JVM

    有人能帮我理解YARN中JVM和容器之间的关系吗? >如何创建JVM,它是每个任务的一个JVM吗?多个任务可以同时在同一个JVM中运行吗? (我知道ubertasking很多任务(maps / ...

  4. python从小白到大牛百度云盘_Java从小白到大牛 (关东升著) 中文pdf+mobi版[36MB]

    <Java从小白到大牛>是一本Java语言学习立体教程,读者群是零基础小白,通过本书的学习能够成为Java大牛.主要内容包括:Java语法基础.Java编码规范.数据类型.运算符.控制语句 ...

  5. java8 jvm 通信_Java必知必会-JVM

    JVM体系结构 类加载器(快递员): 只负责加载java文件,编译后的class文件在文件开头有特定的文件表示,将class文件字节码内容从硬盘加载到JVM内存中并将这些内容转换成方法区的运行时数据结 ...

  6. 全网最硬核 JVM TLAB 分析(额外加菜) 7. TLAB 相关 JVM 日志解析

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  7. 全网最硬核 JVM TLAB 分析 3. JVM EMA期望算法与TLAB相关JVM启动参数

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  8. 如何开启jvm日志_做了10个小实验:搞懂了JVM三大参数类型

    本实验的目的是讲解 JVM 的三大参数类型.在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本节以实验的方式讲解 JVM 参数的查看和设置.希望大家 ...

  9. 如何开启jvm日志_直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解...

    JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势.及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法.垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM ...

最新文章

  1. 数据来源渠道及采集工具_GrowingIO「转化数据回传」| 平台对接免开发,优化投放更便捷...
  2. boost::mp11::mp_bind相关用法的测试程序
  3. linux上安装fio教程,fio工具安装及使用
  4. 比亚迪后续车都会搭在鸿蒙系统吗_华为鸿蒙系统上车,比亚迪汉发布!我告诉你华为鸿蒙到底是什么...
  5. android谷歌打印插件下载地址,ARC Welder(App Runtime for Chrome)插件下载 附下载地址
  6. python 嵌入式界面_运用Python和PyQT开发嵌入式ARM的界面
  7. 广西(柳州)创建国家级车联网先导区建设方案
  8. 2013腾讯实习生面试经历
  9. 日期转毫秒,毫秒转日期
  10. wince之WiFi漫游的工作原理
  11. Linux刻录光盘win10认不到,win10系统无法读取DVD光驱和刻录光盘的设置方法步骤
  12. 红帽考试资料_冰山一角
  13. 《大学“电路分析基础”课程实验合集.实验五》丨线性有源二端网络等效电路的研究
  14. service mysql k8s_Kubernetes/K8S基础使用方法总结【五】——Service
  15. 阿里云ECS mysql安装和远程连接
  16. mysql自定义自增序列
  17. Python爬虫之urllib.request的使用
  18. 车易加加油抵扣卡_油价又要涨啦,预测上调红线将被冲破
  19. Echarts之圆饼图用法
  20. os_cpu_c.c

热门文章

  1. 《SQL Server企业级平台管理实践》读书笔记——SQL Server如何设置自动增长和自动收缩项...
  2. 开了个股票模拟仓来玩玩
  3. 初学者python笔记(元组、字典、集合详解)
  4. php lpop 返回null,数据库读取数据返回 null 怎么办?
  5. Python+pandas使用交叉表分析超市营业额数据
  6. oracle 32 下载,oracle 11g 32位下载
  7. 2017广东全国计算机12月,2018年广东考研时间:2017年12月23日至24日
  8. 力扣55. 跳跃游戏(JavaScript)
  9. idea 分栏_常用SQL优化与IDEA超实用技巧分享
  10. fasterrcnn论文_【每周CV论文推荐】 深度学习人脸检测入门必读文章