总体思路
- 让服务端应用以服务的模式执行,以获得相应的性能提升支持
- 显式地设置堆容量分配,避免对内存资源不合理的应用
- 选择合适的GC算法,提高性能
- 保存GC日志,作为优化的依据
- 保存OOM时的内存信息,以提高OOM排查效率
- 开启JMX服务,以方便监测JVM状态
注:对于堆容量分配和GC算法的选择需要有具体测试数据提供依据,否则可能无法提高性能,甚至降低性能。
让服务端应用以服务的模式执行
-server
开启 JVM 的 server 模式,以支持 JIT编译等相关特性
显示地设置堆容量分配
-Xms -Xmx
根据具体的可用资源规划,显式设置堆大小,可以减少 JVM 自动调整堆大小带来的开销
单位:g | m | k
参数内容示例:
-Xms1g
-Xmx4g
-XX:MaxMetaspaceSize
JDK8中,元数据区容量默认可以自动增长。为了稳定起见,可根据实际情况设置一个明确的上限
单位:g | m | k
参数内容示例:-XX:MaxMetaspaceSize=512m
-Xmn
设置新生代容量
单位:g | m | k
参数内容示例:-Xmn512m
选择合适的GC算法
注:GC算法的选择需要根据实际应用情况选择。此处仅针对(老年代)采用CMS GC时的一般情况。
在“吞吐量优先”的应用,也许应考虑 Parallel GC。
而 G1 GC 则是兼顾 吞吐量 和 停顿时间的 GC。
CMS GC 在大堆情况下会因为内存碎片导致严重停顿;所以堆大于16G时可能得考虑用G1,堆大于30G时则采用CMS得非常谨慎。
而且 JDK9 中 CMS 已被标记为废弃。
通常,G1 是非常值得考虑的GC。当然 JDK11 中的 ZGC 也是值得期待的。
《常见垃圾收集器》
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled
使用 CMS 作为GC方式,且开启并行标记,以减少服务端延迟时间
-XX:+UseParNewGC
针对新生代的GC;是Serial GC的多线程版本
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction
CMS GC算法默认使用启发式的触发规则。这往往会导致老年代快慢的时候才触发GC。
显式地设置这个触发规则可以使得GC行为更能被预测,并减少Full GC带来的性能损耗(如,STW stop-the-world JVM暂停)。
- +UseCMSInitiatingOccupancyOnly 可以取消默认的启发式触发规则;
- CMSInitiatingOccupancyFraction 则可以设置具体什么时候触发CMS GC
- 这个值需要根据具体部署环境下的老年代使用情况进行调优。如果数值较小,可能会导致CMS GC过于频繁;如果数值较大,可能会导致CMS GC触发时机太晚甚至“并行模式失败”
- 一般可以将该值设置为70,即老年代使用量达到70%时会触发CMS GC
参数内容示例:-XX:CMSInitiatingOccupancyFraction=70
-XX:+ScavengeBeforeFullGC
在执行 Full GC 前执行一次 Minor GC可以较少老年代中对象“意外”存活的现象。
这些老年代对象被新生代中的对象所引用, 但这些新生代对象其实已经可以被回收了,所以这些老年代对象其实也应被回收
-XX:+CMSScavengeBeforeRemark
在执行CMS Remark阶段前,执行一次 Minor GC,以降低STW的时间。
通过 Minor GC 可以减少新生代对老年代对象的引用,这样可以减少根对象(GC Roots)数量,从而降低 CMS Remark 的工作量
保存GC日志
-XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -Xloggc:log_file_path
将GC日志输出到指定的文件中
参数内容示例:-Xloggc:/opt/log/gc.log
-XX:+PrintAdaptiveSizePolicy
输出 GC 策略的详细信息,包括:
- Minor GC 中存活下来的对象的内存占用量
- Minor GC 中进入老年代的对象的内存占用量
- Minor GC 的起始时间
- ...
GC 的某些行为是根据运行时情况适应性触发的,通过这些详细信息可以让我们更好地理解为什么会出现我们不希望发生的行为。
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles -XX:GCLogFileSize
与上一组设置配合,设置GC日志文件的大小上限与数量
参数内容示例:
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=10m
保存OOM时的内存信息
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath
一般,OOM出现的频率不高,且OOM的复现成本也比较高,为了方便排查,需要在OOM出现时让JVM保存相关内存信息
参数内容示例:-XX:HeapDumpPath=/opt/log/heap.hprof
开启JMX服务
-Djava.rmi.server.hostname
一台计算机有两个IP,一个对外,一个对内,是很常见的网络部署设置。为了避免JVM自行选择IP带来的不确定性,需要显式地设置JVM上的服务所使用的IP。
注:如果应用本身已经有更明确的 IP选项,则应以具体应用为准,而不是使用该选项提供的值。
如,假设某个Java进程需要用IP1对外提供HTTP Web服务,同时需要用IP2对内其它系统提供dubbo服务,则可以显式地配置dubbo服务所使用的IP2。
当然,如果条件允许,拆分该Java进程,尝试利用“微服务”概念也许是个更好的做法。
参数内容示例:-Djava.rmi.server.hostname=10.1.100.123
-Dcom.sun.management.jmxremote.port
设置该端口可方便在JVM运行时通过一些管理工具来检测运行状况(如,JMC)
参数内容示例:-Dcom.sun.management.jmxremote.port=6789
在确保所运行网络环境安全的情况下,也即只有授权用户才能连接到上述端口,可关闭该管理的权限认证,以方便连接:
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
相关推荐
常用jvm参数都在这张图中,参考起来方便,是国外大神整理的
OpenJDK 8u60 是 OpenJDK 项目的第 60 个更新版本,它是 Java Development Kit(JDK)的一个开源实现。OpenJDK 是由 Sun Microsystems 开始的项目,后来被甲骨文公司接手,并且遵循 GPL2 许可协议,允许开发者自由地...
《JVM排查工具MAT在JDK 11中的应用与OOME问题解决》 Java虚拟机(JVM)是Java程序运行的基础,然而在复杂的系统环境中,内存管理问题时常出现,其中最典型的便是OutOfMemoryError(OOME)。为了解决这类问题,...
标题“jdk8-251 kettle9.2使用jdk版本”和描述中提及了两个关键组件:Java Development Kit (JDK) 的8u251版本以及Kettle 9.2,这是一款流行的数据集成工具,也称为Pentaho Data Integration(PDI)。这些组件在IT...
Java Development Kit(简称JDK)是Oracle公司发布的用于开发和运行Java应用程序的工具包,它包含Java编译器、Java虚拟机(JVM)、Java类库以及一些开发工具。在这个场景中,我们讨论的是JDK的8版的32位免安装版本。...
### Windows版JDK 8u181 (jdk-8u181-windows-x64.exe) 这个`.exe`文件是为64位Windows系统设计的安装程序。通过运行这个文件,用户可以在Windows环境下安装JDK,包括Java编译器(javac)、Java运行时环境(JRE)、...
Java Development Kit(简称JDK)是Oracle公司发布的用于开发和运行Java应用程序的工具包,它包含了Java编译器、Java虚拟机(JVM)、Java类库以及开发者工具。本压缩包"jdk8安装包(含windows和linux版本).zip"提供...
在JDK8中,JVM内存结构发生了显著变化,尤其是元空间(MetaSpace)替代了永久代(Permanent Generation)作为方法区的一部分。这种方法区的调整是由于永久代存在的一些问题,比如大小设定困难,容易引发溢出,以及给...
标题"jdk8绿色免安装版解压即可"指的是Java Development Kit (JDK) 的第8个主要版本的一个特定构建,它是一个便携式版本,无需正式安装过程,用户只需将其解压缩到指定目录,然后进行简单的环境变量配置就能使用。...
这个"最新Java JDK 8免安装版(Linux 64位)"提供了无需繁琐安装过程的便利,使得开发者能够在Linux环境中快速启用Java开发环境。 JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的工具...
### JDK、JRE与JVM的区别详解 #### 一、引言 在深入探讨JDK、JRE与JVM之间的区别之前,我们首先需要明确这三个概念的基本定义及其各自的作用。对于初学者而言,理解这些核心组件是学习Java编程的基础。 #### 二、...
总结来说,Java JDK 8的Windows 32位安装版是开发Java应用的基础,它引入了许多新特性和改进,提升了开发效率和程序性能。正确安装并配置JDK后,开发者可以充分利用这些新功能来编写高效、可维护的Java代码。
### WAS 8.5.5.0 升级至 8.5.5.13 及配置 JDK1.8 手册 #### 一、背景介绍 在 IT 领域,系统的稳定性和兼容性至关重要。随着技术的发展,软件环境也需要不断升级以满足新的需求。IBM WebSphere Application Server...
在本案例中,提供的文件"jdk-8u261-windows-x64.exe"是Java 8的64位Windows版安装包,如果你还没有安装JDK 8,可以使用此文件进行安装。而"MemoryAnalyzer"可能是MAT的可执行文件,直接运行即可启动工具。 总的来说...
《深入解析JDK8u202 Windows x64安装版》 JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包,对于Java开发者来说至关重要。本文将聚焦于JDK8u202的Windows x64版本,详细探讨其...
Java JDK 8是Java开发工具集的一个重要版本,它包含了编译器、JVM(Java虚拟机)、Java类库以及各种开发和调试工具。对于Linux 32位系统的用户来说,免安装版的JDK 8尤其方便,因为它无需经过复杂的安装过程,可以...
本文将详细介绍Linux环境下安装JDK8的步骤,以及在Linux系统中配置和使用JDK的重要性。 首先,JDK8是Oracle公司发布的一个版本,它包括Java编译器(javac)、Java运行时环境(JRE)、Java类库以及一些开发工具,如...
本教程将详细介绍如何在CentOS 8上配置JDK 8,包括下载、安装、配置环境变量以及验证安装的过程。 首先,我们需要了解CentOS 8是一个基于RPM包管理的Linux发行版,它提供了强大的服务器功能和稳定性。JDK 8是Oracle...
1. `bin` 目录:包含可执行文件,如javac(编译器)、java(JVM)、jar(打包工具)等,是开发者最常用的命令行工具。 2. `include` 目录:包含了头文件,用于C或C++编写本地方法时的接口定义。 3. `lib` 目录:存放...
"jdk8的linux版本"特指Oracle公司为Linux操作系统提供的JDK 8发行版。这个版本是Java开发者在Linux环境中进行开发、测试和部署Java应用的基础。 在Linux环境下安装JDK 8的步骤如下: 1. **下载JDK**:首先,你需要...