JVM GC分析

news/2024/12/14 4:50:18/

Eden区、Survivor区、Old区

在Java虚拟机(JVM)的垃圾收集(GC)机制中,堆内存被划分为几个不同的区域,包括Eden区、Survivor区(通常分为两个:From和To或S0和S1)、以及Old区(也称为Tenured区)。这些区域的设计是为了优化垃圾收集过程,提高内存管理的效率。Eden区:
它是新对象分配的主要区域。
当Eden区被填满时,会触发一次Minor GC(也称为Young GC),将存活的对象复制到其中一个Survivor区,并清空Eden区。
Eden区的大小通常比Survivor区大得多,因为大多数对象在创建后不久就变得不可达,可以被迅速回收。
Survivor区:
Survivor区是Eden区和Old区之间的缓冲区,用于存放经过一次Minor GC后仍然存活的对象。
JVM通常有两个Survivor区(From和To,或S0和S1),它们通过复制算法相互协作。在每次Minor GC后,存活的对象会从Eden区和当前的Survivor区(From或S0)复制到另一个Survivor区(To或S1),同时清空原来的两个区域。
经过多次这样的复制过程(通常是15次,这个值可以通过JVM参数调整),仍然存活的对象会被认为是“老”对象,并被移动到Old区。
Old区:
Old区用于存放长生命周期的对象。
当Old区被填满时,会触发Full GC(也称为Major GC),这是一个比Minor GC更耗时的过程,因为它需要遍历整个堆内存。
Full GC的目标是回收Old区中不再使用的对象,并释放相应的内存空间。
这些区域的设计有助于JVM更有效地管理内存,通过减少垃圾收集的频率和持续时间来提高应用程序的性能。同时,JVM还提供了一系列参数来允许开发者和运维人员根据应用程序的具体需求调整这些区域的大小和行为。

java jvm 新生代,老年代 大小如何设置更好

的对象并释放内存。新生代包括Eden区和两个Survivor区(From和To或S0和S1)。
老年代:主要用于存放生命周期较长的对象。当老年代内存不足时,会触发Full GC(也称为Major GC或Old GC),这是一个更耗时的过程,因为它需要遍历整个堆内存来回收不再使用的对象。
二、设置新生代和老年代大小的参数
JVM提供了一系列参数来允许开发者和运维人员调整新生代和老年代的大小:-Xms 和 -Xmx:这两个参数用于设置JVM堆内存的初始大小和最大大小。它们共同决定了堆内存的总大小。
-Xmn:直接设置新生代的大小。然而,这个参数不常用,因为新生代的大小通常是由整个堆内存大小和老年代的比例决定的。
-XX:NewRatio:设置老年代与新生代的大小比例。例如,-XX:NewRatio=3 表示老年代与新生代的比例是3:1。
-XX:SurvivorRatio:设置Eden区与一个Survivor区的比例。例如,-XX:SurvivorRatio=8 表示Eden区占新生代的8/10,而每个Survivor区占1/10。
三、如何更好地设置大小
根据应用程序特点设置:
如果应用程序创建和销毁对象的频率很高(例如,短生命周期的对象很多),可能需要一个较大的新生代。
如果应用程序中有许多长生命周期的对象,可能需要一个较大的老年代。
避免频繁的垃圾回收:
较大的新生代通常意味着Minor GC会发生得更少,但每次GC可能会耗费更多时间。
较大的老年代可以减少Full GC的频率,但每次Full GC可能会更耗时。
内存使用与性能平衡:
要根据应用程序的内存使用模式来调整这些参数,以便在内存使用和垃圾回收性能之间找到最佳平衡。
通常需要通过反复的测试和调整才能找到最佳设置。
参考官方建议:
Sun官方建议新生代的大小为整个堆的3/8左右。
可以根据这个建议作为起点,然后根据应用程序的实际情况进行调整。
监控和调优:
使用JVM提供的监控工具(如jstat、jmap、jconsole等)来观察应用程序的内存使用情况和垃圾回收行为。
根据监控结果进行调整,以优化应用程序的性能和内存管理。
四、示例配置
以下是一个示例配置,用于说明如何设置新生代和老年代的大小:shell
java -Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:SurvivorRatio=8 -XX:NewRatio=2 MyApplication
在这个示例中:-Xms1024m 和 -Xmx1024m 分别设置了JVM的初始堆内存和最大堆内存为1024MB。
-XX:NewSize=256m 和 -XX:MaxNewSize=256m 设置了新生代的初始大小和最大大小为256MB。
-XX:SurvivorRatio=8 设置了Eden区与Survivor区的比例为8:1:1。
-XX:NewRatio=2 设置了老年代与新生代的大小比例为2:1。
请注意,这些参数的具体值需要根据应用程序的实际需求和服务器的硬件配置来调整。不合理的配置可能会导致内存溢出(OutOfMemoryError)或频繁的垃圾回收(GC),影响应用性能。

3、gc分析工具
GCViewer
GCViewer 也是一款非常强大的 gc 日志可视化分析工具,与 GCeasy 稍有不同,它需要本地运行,而且完全免费。

安装和启动方式如下!
在这里插入图片描述
启动服务之后,会弹出一个类似于如下的界面。
在这里插入图片描述
点击左上角的按钮,打开本地的 gc 日志文件,就会显示了日志分析的结果。
在这里插入图片描述
左侧是图表,右侧是数据统计面板,展示的内容还是比较丰富的,有兴趣的访问它的官网特性说明,地址如:https://github.com/chewiebug/GCViewer/wiki


http://www.ppmy.cn/news/1554934.html

相关文章

Scala隐式值

// 隐式值 object test1119 {// 函数的默认参数// 函数的默认参数值:小花def sayName(implicit name: String "小花"): Unit {println(s"我叫:$name")}// 需求:更改函数的默认值,不要写死// 步骤&#xff1…

Horovod:分布式深度学习训练库;Horovod库中DistributedOptimizer

目录 Horovod:分布式深度学习训练库 环境准备 代码示例 运行脚本 Horovod库中DistributedOptimizer DistributedOptimizer的作用 举例说明 Horovod:分布式深度学习训练库 Horovod是一个开源的分布式深度学习训练库,它能够在多个节点(机器)和多个GPU上高效地并行运行…

Elasticsearch一分钟

参考 FST有穷状态转换器/咆哮位图/增量缩紧 Es技术难点 架构

JCR一区牛顿-拉夫逊优化算法+分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测

JCR一区牛顿-拉夫逊优化算法分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测 目录 JCR一区牛顿-拉夫逊优化算法分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院…

mysql 架构详解

MySQL的架构可以自顶向下分为多个层次,每个层次都有其特定的功能和组件。以下是对MySQL架构的详细解析: 一、整体架构概述 MySQL的整体架构包括MySQL Connectors(连接器)、MySQL Shell、连接层、服务层、存储引擎层和文件系统层…

springboot jenkins job error console log

背景 automation test springboot 测试服务 接口返回的 内容是封装过的 jenkins job 只是通过python request 去发送测试请求去测试 jenkins console 里只会有该http 接口response 的 返回信息比如 { response_code: “13000”, response_message: “Failed by …”, label:“…

新手上路,学Go还是Python

选择学习Go语言还是Python取决于你的学习目标和兴趣。以下是两种语言的一些特点,可以帮助你做出决定: Python 1. 易学易用:Python以其简洁明了的语法而闻名,非常适合初学者。 2. 广泛的应用:Python在数据科学、机器学…

MySQL(库的操作)

目录 1. 创建数据库 2. 删除数据库 3. 查看数据库 4. 修改数据库 5. 备份和恢复 6. 查看连接情况 1. 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] 1. 大写的是关键字 2. [ ]可带可不带 3. db_name 数据…