首页 > 其他分享 >JVM调优实战

JVM调优实战

时间:2024-03-17 14:30:37浏览次数:20  
标签:实战 NewSize YGC 新生代 调优 GC 内存 JVM NewRatio

今天我们运用jvm的命令,来观察一个模拟程序的GC情况,以及GC频繁的情况下,如何进行参数调整。

模拟程序

此程序起个5个线程任务,每个任务在不停的在创建对象。每个任务新建了1M的字节数组。我们设置java运行参数为 xms60M,xms60M,后续观察下程序GC情况
 

运行java程序后,观察一下jvm的运行情况。

1.运行 jps获取进程号

2.首先我们运用 jmap -heap 17528查看下jvm内存的分配情况

jmap -heap 输出内容解析

MinHeapFreeRatio:最小堆空闲比率。
MaxHeapFreeRatio:最大堆空闲比率。
MaxHeapSize:最大堆大小,我们配置了60M
NewSize:新生代大小,分配了20M,因为NewRatio默认是2,60*1/3 = 20M
MaxNewSize:新生代最大大小,也是20M。
OldSize:老年代大小,分配了40M,因为NewRatio默认是2
NewRatio:新生代和老年代的比率。由图可知,新生代为20M,老年代为40M,比例为2。
SurvivorRatio:eden和from,to其中一个的比例占新生代的比例,可见from,to=20/8=2.5M
Eden Space:SurvivorRatio=8可得出,20*(1-1/8-1/8)=15M
MetaspaceSize:元空间大小(Java 8 及之后版本)。
CompressedClassSpaceSize:压缩类空间大小(Java 8 及之后版本)。

重点配置解析

NewSize 因为NewRatio默认是2,所以可得出 NewSize 占用内存为 60*1/3,

eden分配了15M,由默认参数SurvivorRatio=8可得出,20*(1-1/8-1/8)=15

survivorFrom和survivorTo都分配了2.5M(20*1/8)。猜想一下当年轻代配置内存很小的情况下,GC是会比较频繁的,那么我们用jstat命令观察下真实的GC情况

观察GC情况

jstat -gcutil pid 1000 ,每秒打印一下GC情况

由图观察,基本没1秒就会进行一次YGC ,原因显而易见,注意,这里的指标代表利用率,而不是用了多少M。那么问题来了,在服务器内存不变的情况下,如何才能降低YGC的频率。分析本实例代码可知,线程的生命周期大概在一秒运行完成,数组对象largeArray即可进行回收,不会晋级到老年代,那么,是否老年代可以腾出一部分空间来给新生代。那么是否可以调整下新生代和老年代的比例,让新生代占用更多的内存,老年代占用更少的内存,来缓解YGC的情况。注意,本优化只针对此代码,不同的场景,所占用的内存情况不一样,需要具体场景具体分析。
我们将 NewRatio参数调整为1,-XX:NewRatio=1

打印下内存配置

此时,NewSize = 30M,OldSize =30 各占一半的内存

再次运行程序后,每秒打印一下GC情况

观察YGC指标可知,原先1秒一次的YGC,经过调整-XX:NewRatio=1参数,缩减为了3秒一次YGC


终结

本次优化,每个任务线程每秒钟产生一个1M的数组,以为没有什么实例变量占用内存,方法堆栈运行完后,没有任何对象需要存活,即可被垃圾回收,那么可以推断,老年代并不需要占用很多的内存。根据这一特性,我们调整一下-XX:NewRatio=1参数,加大了NewSize内存的占比,因此降低了GC的频率。

命令行的方式,很多指标的观察不是很方便,后续小编计划写一篇图形化工具的监控工具Jvisualvm的使用教程,创作不易,欢迎点赞收藏。

标签:实战,NewSize,YGC,新生代,调优,GC,内存,JVM,NewRatio
From: https://blog.csdn.net/da120213828/article/details/136754029

相关文章

  • Java毕业设计-200套基于Springboot+vue的毕设项目实战(源码+论文+演示视频)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • 计算机毕业设计-200套基于Springboot的Java项目实战(附源码+论文+演示视频)
    大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • Python实战:爬取小红书
    有读者在公众号后台询问爬取小红书,今天他来了。本文可以根据关键词,在小红书搜索相关笔记,并保存为excel表格。爬取的字段包括笔记标题、作者、笔记链接、作者主页地址、作者头像、点赞量。一、先看效果1、爬取搜索页2、爬取结果保存到本地excel表格运行我写的爬虫,......
  • Kubernetes 新手实战指南 - 多节点集群部署
    简介Kubernetes是一个用于管理容器化应用程序的开源平台。它提供了一种声明式的方式来部署、管理和扩展应用程序,同时确保高可用性和可扩展性。在本文中,我们将逐步指导您设置一个Kubernetes多节点集群,即使您是Kubernetes的新手。先决条件至少三台具有root权限的Li......
  • C++文件操作实战:创建、写入、读取、修改文件一应俱全
     概述:此C++示例详解文件操作:创建、删除、判断存在、写入、读取和修改文件内容。清晰演示了常见文件处理方法及源代码实现。以下是一个简单的C++实例,演示如何进行文件操作,包括创建文件、删除文件、判断文件是否存在、向文件写入内容、读取文件内容以及修改文件内容。#include......
  • ssts-hospital-web-master项目实战记录三十三:项目迁移-核心模块实现(useDeviceDriver-
    一、设备驱动模块实现service/device-driver/ezware/function-ws/idc-motor-device.tsimport{EventFunctionType,EventResultType}from'@/types'import{EZMessageType,EZWebSocket}from'./ez-web-socket'classIdcMotor{ client:EZWebSocket......
  • JVM 实战 - JVM之类加载过程
    在Java虚拟机(JVM)中,类加载过程是将编译后的.class文件或其它格式的类定义数据加载到JVM内存的方法区,并为这些类型创建运行时的Class对象实例的过程。这个过程确保了Java代码能够在JVM上被正确执行。类加载主要包括以下几个步骤:加载(Loading)通过类的全限定名来查找和读取对......
  • 实战5-某政府采购网cookies反爬(进入前检查浏览器)
    目标网站aHR0cDovL3d3dy55bmdwLmNvbS8=1.呈现状态2.分析网站先复制请求链接的curl看看打印出的结果打印出的结果不正常,来看看请求头,里面有一个'$Cookie',转场到请求连接的cookies中看看,xincaigou这个值大概就是我们想要的往上看其他请求,找xincaigou从哪冒出来,在第二个链......
  • 人工智能入门之旅:从基础知识到实战应用(一)
    一、引言人工智能(ArtificialIntelligence,AI)是指利用计算机科学和技术模拟、延伸和扩展人类智能的理论、方法、技术和应用系统的学科。它的目标是使计算机系统具有类似于人类的智能,能够感知环境、学习、推理、规划、解决问题和交流。在当今社会中,人工智能具有极其重要的地......
  • Python实战:Python异常处理机制及try-except-finally
    本文将详细介绍Python中的异常处理机制,以及如何使用try-except-finally语句来处理程序中的错误和异常情况。我们将深入探讨异常的概念、类型和层次结构,并展示如何在实际编程中应用异常处理来提高代码的健壮性和可维护性。1.引言在编程过程中,错误和异常是不可避免的。异常......