JVM优化

一、什么是JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
主流虚拟机

虚拟机名称 介绍
HotSpot Oracle/Sun JDK和OpenJDK都使用HotSPot VM的相同核心
J9 J9是IBM开发的高度模块化的JVM
JRockit JRockit 与 HotSpot 同属于 Oracle,目前为止 Oracle 一直在推进 HotSpot与 JRockit 两款各有优势的虚拟机进行融合互补
Dalvik Android上的Dalvik 虽然名字不叫JVM,但骨子里就是不折不扣的JVM

二、JVM与操作系统

为什么要在程序和操作系统中间添加一个JVM
Java 是一门抽象程度特别高的语言,提供了自动内存管理等一系列的特性。这些特性直接在操作系统上实现是不太可能的,所以就需要 JVM 进行一番转换。

JVM优化_第1张图片
从图中可以看到,有了 JVM 这个抽象层之后,Java 就可以实现跨平台了。JVM 只需要保证能够正确执行 .class 文件,就可以运行在诸如 Linux、Windows、MacOS 等平台上了。而 Java 跨平台的意义在于一次编译,处处运行,能够做到这一点 JVM 功不可没。比如我们在 Maven 仓库下载同一
版本的 jar 包就可以到处运行,不需要在每个平台上再编译一次。现在的一些 JVM 的扩展语言,比如 Clojure、JRuby、Groovy 等,编译到最后都是 .class 文件,Java 语言的维护者,只需要控制好 JVM 这个解析器,就可以将这些扩展语言无缝的运行在 JVM 之上了。
应用程序、JVM、操作系统之间的关系
JVM优化_第2张图片
最后,我们简单看一下一个 Java 程序的执行过程,它到底是如何运行起来的

JVM优化_第3张图片

三、GC日志分析

GC日志是一个很重要的工具,它准确记录了每一次的GC的执行时间和执行结果,通过分析GC日志可以优化堆设置和GC设置,或者改进应用程序的对象分配模式。
GC日志参数

参数 说明
-XX:+PrintGC 打印简单GC日志。 类似:-verbose:gc
-XX:+PrintGCDetails 打印GC详细信息
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:…/logs/gc.log 指定输出路径收集日志到日志文件

日志分析工具
在线分析工具 https://gceasy.io/index.jsp

  • GCeasy是一款在线的GC日志分析器,可以通过GC日志分析进行内存泄露检测、GC暂停原因分析、JVM配置建议优化等功能,而且是可以免费使用
    JVM优化_第4张图片

三、调整JVM参数进行优化

1.设置并行垃圾回收器

#年轻代、老年代均使用并行收集器,初始堆内存64M,最大堆内存512M
JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -
XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

展示测试结果:

JVM优化_第5张图片
2.调整年轻代大小

JAVA_OPTS="-XX:+UseParallelGC-XX:+UseParallelOldGC-Xms512m-Xmx512m-XX:NewRatio=2-XX:SurvivorRatio=8-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintGCDateStamps-XX:+PrintHeapAtGC-Xloggc:../logs/gc.log"

JVM优化_第6张图片
3.设置G1垃圾收集器
理论上而言,设置为G1垃圾收集器,性能是会提升的。但是会受制于多方面的影响,也不一定绝对有提升。

#设置使用G1垃圾收集器最大停顿时间100毫秒,初始堆内存512m,最大堆内存512m
JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms512m -Xmx512m -XX:+PrintGCDetails -
XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

你可能感兴趣的:(JVM,jvm,java,开发语言)