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

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

Java 额外说明

收录于:42天前

深入浅出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

. . .

相关推荐

额外说明

linux nginx1.24.0安装

nginx高性能web服务器,可作为一般http应用转发,也可以做mySql、redis、zk、rabbit MQ等tcp数据流转发。 常用Linux服务系统centos和ububtu 只是安装命令不同 yum/apt-get,流程和依赖包是一样的安装方

额外说明

如何将工作分配给你不想做的人

别威逼利诱 说明这件事的重要性。        要照顾他的需求,他不想做这件事的原因。  比如他手上还有一堆的杂事,那么就可以坐下来谈谈,把这些事放一起排排优先级。 说明这件事的目的,他手头的可以放后面做,或协调资源来做。  

额外说明

MyBatis-Plus03_Paging插件,自定义分页

文章目录 ①. 分页插件 ②. xml自定义分页 ①. 分页插件 ①. MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能 ②. 添加配置类 @Configuration public class MybatisPlusConfig {

额外说明

Midjourney|文心一格 Prompt:完整参数列表、风格汇总、文生图词典合集

Midjourney|文心一格 Prompt:完整参数列表、风格汇总、文生图词典合集 1.Midjourney 完整参数列表 参数名称 调用方法 使用案例 注意事项 V5 V4 V3 niji 版本 在关键词后加空格,然后带上版本参数: --v 或者 —

额外说明

Docker部署MySql

1.介绍 说明:当我们利用Docker安装应用时,Docker:会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用 运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器。可以安装多个MySql 2

额外说明

jQuery监听鼠标长按事件

jQuery监听鼠标长按事件 <script> var timeout;//用于存储定时器的变量 //#moveLeft 表示需要监听长按事件的元素 $("#moveLeft").mousedown(function() {

额外说明

C语言编译过程

编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。 C源程序头文件-->预编译处理(cpp)-->编译程序本身-->

额外说明

ROS从入门到精通5-3:插件库与开发+实例分析

目录 0 专栏介绍 1 什么是插件? 2 ROS插件库Pluginlib 3 自定义插件开发 3.1 插件开发基本流程 3.2 实例:多边形插件 0 专栏介绍 本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进

额外说明

深入JavaScript之BOM、DOM和事件

文章目录 BOM 概念 对象组成 Window:窗口对象 方法 与弹出框有关的方法 与打开关闭有关的方法 与定时器有关的方式 属性 获取其他BOM对象 获取DOM对象 特点 Location:地址栏对象 创建(获取): 方法: 属性 History:历史

ads via 小工具