本文只讨论JVM本身的性能优化,不涉及通过系统架构角度调优整体性能,原因是想重点讨论JVM本身。架构级的性能优化后续会总结归纳单独讨论。
首先,需要确定调优目标,即最求系统的响应时效性或者是CPU计算吞吐量。之所以这么说的原因是,固定CPU的情况下,CPU的计算能力几乎是一定的(排除超频)。追求响应时效性,要让CPU的计算要尽可能在最短时间内满足应用程序本身的线程调用,而不是让应用程序线程处于等待状态;追求CPU吞吐量,是要在一个段内CPU的计算尽可能多的用于应用程序本身的线程,也可以说成是(CPU有效技术/CPU计算量)×时间的值。
通常,与用户交互较频繁的系统更加关注系统的响应时效性,与用户交互较少甚至几乎无交互的系统更关注CPU计算吞吐量。
影响一个应用系统性能因素基本上有几点:CPU、内存、硬盘、网络、其他外设。此处排除代码逻辑导致的系统性能问题(假设认为应用程序本身的逻辑都是业务需求且合理的)。几点因素中能涉及到JVM的性能优化基本只有内存一个。
由于Java语言不再需要开发人员管理内存,内存回收工作全部由JVM的垃圾回收器负责了。因此,花在内存回收上的CPU计算就也就成了影响JVM性能的一个很重要的元凶。假想一下,如果你的CPU大部分时间都在忙着替你整理内存而顾不上给你真正需要做的事情服务,系统的高性能从何谈起呢?
要优化内存回收,就要先看下JVM是怎么管理使用内存的,《Java虚拟机(Java SE 7版)》规定,Java虚拟机管理的内存包括如下几部分:
1、堆(Heap);
2、虚拟机栈(VM Stack);
3、本地方法栈(Native Method Stack);
4、方法区(Method Area);
5、程序计数器(Program Counter Register);
注:Sun HotSpot直接将2、3合二为一。
而为了内存回收方便,又把这几个区域分为:新生代(Young)、老年代(Tenured)、方法区(永久代Perm)。虚拟机的垃圾回收器是按代分类的,重点在新生代和老年代。下表是各回收器的所处分代、自身特性及推荐的使用场景等信息
回收器名称 | 所处分代 | 并行性 | 使用收集算法 | 推荐使用场景 |
Serial | 新生代 | 串行 | 复制算法 | 单核CPU系统 |
Serial OLD | 老年代 | 串行 | 标记整理 | 单核CPU系统、CMS回收器的后备军 |
ParNew | 新生代 | 并行 | 复制算法 | 多核CPU系统,-server模式下 默认新生代收集器 |
Parallel Scavenge | 新生代 | 并行 | 复制算法 | 注重CPU吞吐量的系统 |
Parallel Old | 老年代 | 并行 | 标记整理 | 注重CPU吞吐量的系统 |
Concurrent Mark Sweep(CMS) | 老年代 | 并行 | 标记清除 | 多核系统,注重响应时效性 |
Garbage-First(G1) | 全部 | 并行 | 标记整理 | 垃圾回收器的最前沿,性能有待考验 |
新老年代回收器的组合方式如下图:
可以通过JVM参数来制定使用何种组合,使用命令:java -XX:+PrintFlagsFinal查看除了Diagnostic和Expermental外的所有非稳定参数的名称及默认值
这里仅给出如何制定垃圾回收器组合的参数
参数 | 默认值 | 回收器组合 |
-XX:+UseSerialGC | -Client默认开启 | Serial+Serial Old |
-XX:+UseParallelOldGC | 默认关闭 | Parallel Scavenge+Parallel Old |
-XX:+UseParallelGC | -Server默认开启 | Parallel Scavenge+Serial Old |
-XX:+UseParNewGC | 默认关闭 | ParNew+Serial Old |
-XX:+UseConcMarkSweepGC | 默认关闭 | ParNew+CMS+SerialOld |
-XX:+UseG1GC | 默认关闭 | G1 |
从上表可见,如果我们追求响应时效性,可以考虑将内存回收器组合调整为ParNew+CMS+SerialOld模式尝试一下;如果追求CPU吞吐量,可以调整为Parallel Scanvenge+Parallel Old模式。当然,这只是在选择内存回收组合层面。
还要根据根据具体的应用程序对内存的使用量,新老生代内存的使用量,方法区使用量等因素,相应的调整内存的堆大小,方法区最大值等。最终达到减少内存回收次数及总回收时间的目的。
本文旨在抛砖引玉,欢迎大家提出各自的经验看法讨论
相关推荐
在Jvm中,还有很多其他的知识点,如HotSpot虚拟机、JIT编译、垃圾回收算法等,它们都是Jvm性能优化的重要组成部分。 Jvm性能优化是Jvm中非常重要的一部分,它对Jvm的性能产生了很大的影响。了解Jvm内存结构、垃圾...
Hotspot JVM 是 Java 虚拟机的一种实现,它提供了以下几个组件: * 字节码执行:使用解释器、两种运行时编译器或 On-Stack Replacement * 存储分配和垃圾回收 * 运行时环境:包括启动、关闭、类加载、线程、与操作...
- **IBM JVM**:IBM也提供了一种JVM实现,它在内存管理和性能方面有着独特的优化策略。例如,IBM JVM支持多种GC算法,可以针对不同的应用场景进行优化配置。 #### Java编译模式与优化 - **解释模式**:Java程序...
Hotspot是Oracle JDK和OpenJDK中的一个JVM实现,以其高效性能和优化能力而著称。本文将深入探讨OpenJDK中的JVM Hotspot实现源码,帮助读者理解其内部机制和优化策略。 首先,Hotspot JVM的核心设计理念是“热Spot”...
OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)
JVM性能优化是提升Java应用效率的关键环节,涉及到内存管理、垃圾回收、线程调度等多个方面。以下是对"Java JVM及性能优化"和"Java性能分析"的详细阐述: 一、JVM结构与工作原理 1. 类装载器:负责加载类文件,确保...
这本书是探索Java虚拟机性能工程的深入指南,专注于OpenJDK和HotSpot JVM,适合希望优化Java应用性能的开发者。
在《实战Java虚拟机——JVM故障诊断与性能优化》一书中,作者深入探讨了如何对JVM进行故障排查和性能调优,通过源码分析来帮助读者理解其内部工作原理。下面我们将根据书中的主题,详细阐述相关的知识点。 1. **JVM...
- **动态编译**:HotSpot JVM的C1和C2编译器,分别针对短循环和长执行路径的代码优化。 7. **性能监控与诊断** - **JConsole和VisualVM**:提供可视化界面监控JVM状态,包括内存、线程、类加载、GC等。 - **JMX*...
综上所述,JVM优化是一个系统性工程,涵盖了从基础知识点到监控分析再到性能调优的一系列知识。理解JVM内部机制和不同JVM实现之间的区别,对于高效地优化Java应用性能是必不可少的。通过合理地应用各种优化手段,...
JDK 13 JRockit 到 HotSpot 迁移指南是一份详细的指南,旨在帮助开发者将 Java 应用程序从 JRockit JVM 迁移到 HotSpot JVM。该指南面向 Java 平台标准版,版本号为 13,发布于 2019 年 9 月。 该指南的主要内容...
Compilation in the HotSpot VM 是一篇关于 HotSpot JVM 的技术文档,详细介绍了 HotSpot JVM 的编译过程、优化和分层编译等技术。该文档对于了解 HotSpot JVM 的工作原理和编译过程非常有价值。
Hotspot VM提供了丰富的性能监控和调试工具,如JConsole、VisualVM、JFR(Java Flight Recorder)、JITWatch等,它们可以帮助开发者深入了解JVM的运行状态,定位性能瓶颈,进行问题排查。 总结来说,Hotspot JVM...
《实战JAVA虚拟机 JVM故障诊断与性能优化》这本书深入探讨了Java开发中不可或缺的Java虚拟机(JVM)技术,对于Java开发者来说,理解JVM的工作原理、故障诊断以及性能调优是至关重要的。以下将围绕这些主题展开详细的...
总之,JVM优化涉及到内存分配、垃圾收集器选择、垃圾回收策略以及各种性能优化参数的调整。这些配置需要根据实际应用的负载、内存需求以及性能指标进行精细化调整,以确保应用程序的高效稳定运行。
【HotSpot GC官网文档截图 - 20200917】是一个珍贵的资源集合,包含了一系列关于Java HotSpot虚拟机(JVM)垃圾收集器(GC)的官方文档截图。这些截图详细介绍了GC的发展历程、不同版本的特性、选择GC的策略以及调优...
HotSpot是Oracle公司开发的高性能JVM,它在Java应用程序的运行时提供了一个优化的平台。本书针对HotSpot JVM的内部工作原理、性能调优和相关技术进行了详尽的解析,对于Java开发者和性能优化工程师来说,是一份非常...
在Java开发中,我们经常会遇到JVM性能优化的需求,以确保系统能够高效、稳定地运行。以下是根据提供的内容,对JVM性能调优的一些关键知识点的详细解释: 1. **内存设置**: - `-Xmx` 和 `-Xms` 参数用于设置Java堆...
《深入JVM内核—原理、诊断与优化》是一份深度探索Java虚拟机(JVM)的视频教程,旨在帮助开发者全面理解JVM的工作机制,掌握性能诊断技巧,并能进行有效的优化。本教程覆盖了从基础到高级的JVM主题,不仅适用于Java...