小工具      在线工具  汉语词典  css  js  c++  java

深入浅出JVM调优,看完你就懂

Java 额外说明

收录于:97天前

深入浅出JVM调优
基本概念:

JVM将内存区域分为堆、栈和方法。由于本文主要讲解 JVM 调优,因此我们可以简单理解为 JVM 中的堆区存储的是实际的对象,需要进行 GC。其他都不需要 GC。

下图是JVM的内存模型

深入浅出JVM调优,看完你就懂

从图中我们可以看出

1、JVM本质上分为三大部分,年轻代(YoungGen)、老年代(Old Memory)、持久代(Perm,在Java 8中被取消,我们不再深入介绍)。

2.垃圾收集GC分为两种。一种是Minor GC,可以称为YGC,即年轻代GC。在Eden区,还有一种叫做Major GC,也称为Full GC。

3、气相色谱原理:

我们可以看到年轻代包括Eden区(对象刚new的时候就放在这个区)、S0和S1,分别是survivor 1区和survivor 2区。从名字上就可以看出,当YGC发生时,没有被任何其他对象引用的对象将会从内存中被清除,而那些仍然被其他对象引用的对象将会被放置在survivor区中。当多次发生YGC时,S0和S1区域中多次未清除的对象将被移动到老年代区域。当老年代区满了,就会发送FullGC。

无论是YGC还是FullGC,都会造成stop-the-world,即整个程序停止处理部分事务,只允许GC进程进行垃圾回收。因此,如果垃圾回收时间较长,一些web或socket程序,当终端连接时,报connetTimeOut或readTimeOut异常时,

4、从JVM调优的角度,应该尽量避免YGC或FullGC,或者让YGC和FullGC的时间足够短。

JMV 调整的准备工作。

1)配置jstatd的远程RMI服务(当我们想查看远程服务器上JAVA程序的GC情况时,需要执行这一步),让JVM工具可以查看JVM的使用情况。

将以下代码保存为文件 jstatd.all.policy 并将其放入 JAVA_HOME/bin 中。其内容如下:如果不知道JAVA_HOME目录,可以执行which java来查看。

授予代码库“文件:$ {java.home} /../lib/tools.jar”{

权限 java.security.AllPermission;

};

执行命令 jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=10.27.20.38 &

(10.27.20.38是你服务器的IP地址,&表示作为守护线程运行)

2)。执行 C:\glassfish4\jdk7\bin\jvisualvm.exe 打开 JVM 控制台。

在Tools--Plug-ins--找到Visual GC插件进行安装。

3)。调整要执行的Java 程序。以c1000k.jar为例,在jar包所在目录下创建start.sh文件。文件内容如下。

java -server -Xms4G -Xmx4G -Xmn2G -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.authenticate =假-Dcom.sun.management.jmxremote.ssl=假-jar c1000k.jar&

通过此配置,您可以使用 JVM 控制台查看 JVM(CPU/内存)和垃圾收集状态。

4)、控制台配置

打开\jvisualvm.exe,remote---添加远程主机---输入远程IP----添加JMX连接

深入浅出JVM调优,看完你就懂

5)。下面开始正式的JVM调优。

5.1 JVM调优的核心是调整年轻代和年老代的内存空间大小以及所使用的GC生成器的类型。回到上面start.sh文件的内容,我们来分解一下:

java -server -Xms4G -Xmx4G -Xmn2G -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.authenticate =假-Dcom.sun.management.jmxremote.ssl=假-jar c1000k.jar&

本机为4G内存机器,因此:

-Xms4G是指:JVM启动时整个堆(包括年轻代和老年代)的初始大小。

-Xmx4G指:JVM启动时整个堆的最大值。

-Xmn2G指:年轻代的空间大小,其余为老年代的空间。

-XX:SurvivorRatio=1指:年轻代空间中两个Survivor空间与Eden空间的大小比例。这里是1:1:1,算法如下: 比如整个年轻代空间是2G。如果比例为1,则为2/3,则S0/S1/Eden的空间大小相同,均为666M。

如果不设置该值,JDK默认的比例为8,即1:1:8。通过上述算法即可得到S0/S1的大小。我们可以看到官方通过增加Eden区的大小来减少YGC的发生次数,但有时我们会发现虽然次数减少了,但Eden区却满了。

此时,由于占用空间较大,释放速度较慢。此时stop-the-world时间较长,需要根据程序情况进行调整。

-XX:+UseConcMarkSweepGC 指:使用GC回收类型。这是 CMS 类型。 JDK1.7以后建议使用+UseG1GC,称为G1类型(或Garbage First)收集器。

5.2 我们设置好start.sh的参数值后,执行./start.sh就会启动。

我们可以通过jvisualvm.exe中的Visual GC插件查看GC图形。我们还可以在服务器上执行:jstat -gc 15016 1000来查看1秒15016号java进程的GC回收情况。

[root@yxdevapp04 c1000k]# jstat -gc 15016 1000

S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT

699008.0 699008.0 29980.4 0.0 699136.0 116881.6 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272

699008.0 699008.0 29980.4 0.0 699136.0 118344.8 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272

699008.0 699008.0 29980.4 0.0 699136.0 119895.5 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272

699008.0 699008.0 29980.4 0.0 699136.0 121383.1 2097152.0 660769.4 21248.0 20071.0 354 54.272 0 0.000 54.272

解释如下:

S0C指:Survivor0区分配的空间

S0U指的是:Survivor1区域已使用的空间

EC指:Eden区使用的空间

EU指的是:Eden区域当前使用的空间

OC指:老年代分配的空间

OU指:老年代当前使用的空间

PC指的是:要分配的持久空间

PU指:等待当前使用的持久空间

YGC指的是:年轻代出现的次数,这里是354次

YGCT指的是:年轻代发送的总时间,这里是54.272秒,所以年轻代每次发生GC,平均stop-the-world时间为54.272/354=0.153秒。

FGC指的是:老年代回收的次数,或者说变成FullGC的次数。

FGCT指:老年代回收的总时间。

GCT是指:包括年轻代YGC和老年代FGC的总时间。

通常结合图形或者数据,我们可以看到,当EU即将等于EC时,此时YGC发生,因此YGC的数量+1,YGCT时间增加。

经过实际调优测试,我们发现,当YGC发生时,如果S0U或S1U区域中的任意一个区域为0,则此时YGC速度非常快。相反,如果S0U或S1U中有数据,或者比较满时,此时YGC的时间边较长,这是S0/S1和Eden区的比例问题造成的。

5.3 经过一定时间的调优,我们基本上可以让YGC的数量非常少,时间非常快,而且很长一段时间或者几天都不会出现FGC。这个时候,JVM调优也算是一个不错的结果了。

5.4 在MAC计算机上,可以通过jconsole调用图形分析工具。


原文链接:https://blog.csdn.net/Javazhoumou/article/details/99298624

. . .

相关推荐

额外说明

【idea调试】 调试时怎么回退 Jump to Line 插件

场景 每次调试因按下一步太快,而跳过了想要分析的那一段代码,这时,我们就会跳完所有 断点再运行一次, 有没有办法退到上一步呢? 解决方案 安装插件 操作 旧idea2022.1版本之前 按下面小图标,就会清除当前,跳到上一个断点 注意,低版本的,没法在同

额外说明

文档关键信息提取形成知识图谱:基于NLP算法提取文本内容的关键信息生成信息图谱教程及码源(含pyltp安装使用教程)

文档关键信息提取形成知识图谱:基于NLP算法提取文本内容的关键信息生成信息图谱(含pyltp安装使用教程) 1. 项目介绍 目标:输入一篇文档,将文档进行关键信息提取,进行结构化,并最终组织成图谱组织形式,形成对文章语义信息的图谱化展示。 如何用图谱和结

额外说明

web前端面试高频考点——Vue的基本使用(一文掌握Vue最基础的知识点)

系列文章目录 内容 参考链接 Vue基本使用 Vue的基本使用(一文掌握Vue最基础的知识点) Vue通信和高级特性 Vue组件间的通信及高级特性(多种组件间的通信、自定义v-model、nextTick、插槽) Vue高级特性 Vue的高级特性(动态组

额外说明

《零基础安装 Oracle 数据库》单机系列 ① 一键快速安装 Oracle 11GR2 数据库

目录 前言 安装 下载项目 安装软件 下载 Oracle 安装包 安装 编辑 vagrant.yml 文件 开始安装 使用方式 连接主机 关闭主机 开启主机 销毁主机 写在最后 前言 很多朋友吐槽我的脚本不会用,看不懂,哎,一言难尽!于是,我将 [vag

额外说明

OpenCV实战——使用邻居访问扫描图像

OpenCV实战——使用邻居访问扫描图像 0. 前言 1. 图像锐化 2. 邻居访问扫描图像 3. 锐化滤波器 4. 完整代码 相关链接 0. 前言 在图像处理中,有时需要根据某个像素的相邻像素的值计算该像素位置的值。当这个邻域包括上一行和下一行的像素时

额外说明

sudo unable to open read-only file system”的原因

此错误是由多种原因引起的,包括: 文件系统不一致。 文件系统配置错误(/etc/fstab 文件中的错误条目)。 由于各种原因(包括突然断电或电缆损坏)导致系统意外或突然关闭。 在某些情况下,Windows 的双引导设置可能会导致此错误。 硬件故障。 1

额外说明

vscode个人自定义配置

vscode自定义美化配置 { "liveServer.settings.CustomBrowser": "chrome", "tabnine.experimentalAutoImports": true, //prettier插件格式化

额外说明

linux文件属性解析,Linux操作系统的文件属性与目录配置解析

-rwxrwxrwx 1 root root 293 Oct 19 21:24 test 第一列表示这个文件的属性 第二列表示连接占用的节点 第三列表示文件(或目录)的拥有者 第四列表示拥有者的用户组 第五列表示这个文件的大小 第六列为这个文件的创建日期

额外说明

Java学习笔记7.1.2 初探Swing世界 - 布局管理器

文章目录 零、本讲学习目标 一、布局管理器 二、边框布局管理器(BorderLayout) (一)边框布局管理器概述 (二)边框布局管理器API文档 (三)边框布局管理器使用方法 (四)边框布局案例演示 三、流式布局管理器(FlowLayout) (一)

额外说明

在Tomcat 与weblogic 中的 日志(log4j) 配置系列三(log文件的存放路径)

前言 前面一直在说,如何读取到log4j 的配置文件 log4j.properties。 接下来的探讨的是: log4j 里配置产生的log 文件的路径如何设置。 tomcat 还好。拿复杂点的 weblogic 来说,因为不解压war 档,这个路径该如

ads via 小工具