垃圾收集器及内存分配

目录

垃圾收集器种类

HotSpot虚拟机所包含的收集器

垃圾收集器部分源码

垃圾收集器后台日志参数说明与配对关系

1、串行垃圾收集器

串行垃圾收集器运行示意图

1)、编写测试代码

2)、设置垃圾回收为串行收集器

3)、启动程序,GC日志信息解读

2、并行垃圾收集器

并行垃圾收集器-ParNew运行示意图

1)、编写测试代码

2)、设置垃圾回收为并行收集器ParNew

3)、启动程序,GC日志信息解读

并行垃圾收集器-ParallelGC运行示意图

1)、编写测试代码

2)、设置垃圾回收为并行收集器ParallelGC

3)、启动程序,GC日志信息解读

3、CMS垃圾收集器

CMS垃圾收集器运行示意图:

1)、编写测试代码

2)、设置CMS垃圾回收参数

3)、启动程序,GC日志信息解读

4、G1垃圾收集器

G1垃圾收集器(将新生代,老年代的物理空间划分取消了),示意图如下

G1垃圾收集器(G1算法将堆划分为若干个区域-Region)

G1垃圾收集器原理

G1垃圾回收模式:Young GC

G1垃圾回收模式:Mixed GC

G1垃圾收集器运行示意图

1)、编写测试代码

2)、G1垃圾收集器相关参数:

3)、设置G1垃圾回收参数

4)、启动程序,GC日志信息解读

G1垃圾收集器 vs CMS垃圾收集器

G1垃圾收集器优化建议

可视化GC日志分析工具

1、GC日志输出参数

2、GC Easy可视化工具

GC Easy查看gc报告


垃圾收集器种类

HotSpot虚拟机所包含的收集器

垃圾收集器部分源码

垃圾收集器后台日志参数说明与配对关系

  • DefNew - Default New Generation
  • Tenured - Old
  • ParNew - Parallel New Generation
  • PSYoungGen - Parallel Scavenge
  • ParOldGen - Parallel Old Generation

1、串行垃圾收集器

串行垃圾收集器是最基本的、发展历史最悠久的收集器。

特点:单线程、简单高效(与其他收集器的单线程相比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。收集器进行垃圾回收时,必须暂停其他所有的工作线程,直到它结束(Stop The World)。

串行垃圾收集器运行示意图

1)、编写测试代码

import java.util.UUID;

/**************************************************
 *
 * @title
 *
 **************************************************/
public class TestGC1 {
    /**
     * java -XX:+PrintCommandLineFlags -version
     *
     * @param args
     */
    public static void main(String[] args) {
        String str = "smart";
        while (true) {
            str += str + UUID.randomUUID();
            str.intern();
        }
    }
}

2)、设置垃圾回收为串行收集器

在程序运行参数中添加2个参数,如下:

-XX:+UseSerialGC 指定年轻代和老年代都使用串行垃圾收集器

-XX:+PrintGCDetails 打印垃圾回收的详细信息

3)、启动程序,GC日志信息解读

2、并行垃圾收集器

并行垃圾收集器在串行垃圾收集器的基础之上做了改进,将单线程改为了多线程进行垃圾回收,这样可以缩短垃圾回收的时间。(这里是指,并行能力较强的机器)

当然了,并行垃圾收集器在收集的过程中也会暂停应用程序,这个和串行垃圾回收器是一样的,只是并行执行,速度更快些,暂停的时间更短一些。

并行垃圾收集器-ParNew运行示意图

ParNew垃圾收集器

通过-XX:+UseParNewGC参数设置年轻代使用ParNew回收器,老年代使用的依然是串行收集器

通过-XX:+ParallelGCThreads可以限制GC线程数量,默认开启和cpu数目相同的线程数

1)、编写测试代码

同之前的代码

2)、设置垃圾回收为并行收集器ParNew

在程序运行参数中添加1个参数,如下

-XX:+UseParNewGC
-Xms8m
-Xmx8m
-XX:+PrintGCDetails
-XX:+PrintCommandLineFlags

3)、启动程序,GC日志信息解读

解释:

        ParNew - 年轻代ParallelNew垃圾收集器

        Tenured - 老年代Serial Old垃圾收集器

并行垃圾收集器-ParallelGC运行示意图

ParallelGC垃圾收集器

ParallelGC收集器工作机制和ParNewGC收集器一样,只是在此基础之上,新增了两个和系统吞吐量相关的参数,使得其使用起来更加的灵活和高效。适合大数据计算。

1)、编写测试代码

同之前代码

2)、设置垃圾回收为并行收集器ParallelGC

ParallelGC垃圾收集器相关参数如下:

-XX:+UseParallelGC

-XX:+UseParallelOldGC

-XX:MaxGCPauseMillis

-XX:ParallelGCThreads=N

解释:

        (1)-XX:+UseParallelGC、-XX:+UseParallelOldGC这两个参数可以相互激活,也就是说,配置一个可以,可以不用配置另外一个;

        (2)-XX:MaxGCPauseMillis - 最大停顿时间,其值为大于0的毫秒数,垃圾收集器尽可能保证回收的耗时不超过设定的值,但是并不是越小越好,如果值设置太小,那么GC的频率会提高,这样吞吐量就降低了。

        (3)-XX:GCTimeRatio=99 - 控制吞吐量大小,其值为0-100的整数,表示吞吐量,默认值是99,表示允许1%的垃圾回收时间占比。

        (4)-XX:ParallelGCThreads=N - 控制垃圾回收线程数,此参数设置年轻代并行收集器的线程数,一般与CPU数量相等,过多的线程数量会影响垃圾回收以及整个程序的性能。

        (5)-XX:UseAdaptiveSizePolicy - ParallelGC可以自动调整Survivor空间,大部分的程序使用自动调整可以满足要求,个别应用在需要的情况下可以关闭自动调整,进行手动调整

具体:请参考https://www.cnblogs.com/ysqzy/p/16930918.html

3)、启动程序,GC日志信息解读

解释: 

        PSYoungGen - Parallel Scavenge

        ParOldGen -  Parallel Old Generation

3、CMS垃圾收集器

CMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器,该回收器是针对老年代垃圾回收的,通过参数-XX:+UseConcMarkSweepGC进行设置。适合互联网,响应时间短、CPU核数多的应用。

CMS垃圾收集器运行示意图

CMS垃圾回收器的执行过程如下:

1)、编写测试代码

同之前的代码

2)、设置CMS垃圾回收参数

-‐XX:+UseConcMarkSweepGC

注意:开启后将采用ParNew+CMS+Serial Old收集器组合

3)、启动程序,GC日志信息解读

4、G1垃圾收集器

G1垃圾收集器是在jdk1.7update4中正式使用的全新的垃圾收集器,oracle官方在jdk9中将G1变成默认的垃圾收集器,以替代CMS。

G1的设计原则就是简化JVM性能调优,开发人员只需要简单的三步即可完成调优:

  • 第一步,开启G1垃圾收集器
  • 第二步,设置堆的最大内存
  • 第三步,设置最大的停顿时间
    • G1中提供了三种模式垃圾回收模式,Young GC、Mixed GC 和 Full GC,在不同的条件下被触发

G1垃圾收集器相对比其他收集器而言,最大的区别在于它取消了年轻代、老年代的物理划分,取而代之的是将堆划分为若干个区域(Region),这些区域中包含了有逻辑上的年轻代、老年代区域。这样做的好处就是,我们再也不用单独的空间对每个代进行设置了,不用担心每个代内存是否足够。

G1垃圾收集器(将新生代,老年代的物理空间划分取消了),示意图如下

G1垃圾收集器(G1算法将堆划分为若干个区域-Region)

G1垃圾收集器原理

解释:

        G1每个堆区域最大32M,默认划分2048个区域,也就是说最大64G内存。

在G1划分的区域中,年轻代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者Survivor空间,G1收集器通过将对象从一个区域复制到另外一个区域,完成了清理工作。

这就意味着,在正常的处理过程中,G1完成了堆的压缩(至少是部分堆的压缩),这样也就不会有cms内存碎片问题的存在了。

在G1中,有一种特殊的区域,叫Humongous区域。如果一个对象占用的空间超过了分区容量50%以上,G1收集器就认为这是一个巨型对象。

这些巨型对象,默认直接会被分配在老年代,但是如果它是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。

为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象。如果一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动Full GC

针对Young GC主要是对Eden区进行GC,它在Eden空间耗尽时会被触发。Eden空间的数据移动到Survivor空间中,如果Survivor空间不够,Eden空间的部分数据会直接晋升到年老代空间。

Survivor区的数据移动到新Survivor区中,也有部分数据晋升到老年代空间中。最终Eden空间的数据为空,GC停止工作,应用线程继续执行。

G1垃圾回收模式:Young GC

G1垃圾回收模式:Mixed GC

分2步:

  • 全局并发标记(global concurrent marking)
  • 拷贝存活对象(evacuation)

当-XX:InitiatingHeapOccupancyPercent=N (老年代大小占堆百分比达45%的时候触发mixed GC),触发MixedGC,执行下面流程

G1垃圾收集器运行示意图

1)、编写测试代码

同之前的代码

2)、G1垃圾收集器相关参数:

-XX:UseG1GC

-XX:MaxGCPauseMillis - 执行最大GC暂停时间

-XX:G1HeapRegionSize=N (1-32M,默认2048个分区,最大64G内存)

-XX:G1ReservePercent=N - 预留空闲空间,避免内存溢出,默认10%,一般不能设置

-XX:ConcGCThreads=N - GC线程数

-XX:InitiatingHeapOccupancyPercent=N (老年代大小占堆百分比达45%的时候触发mixed GC)

3)、设置G1垃圾回收参数

‐XX:+PrintGC 输出GC日志

‐XX:+PrintGCDetails 输出GC的详细日志

‐XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)

‐XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013‐05‐04T21:53:59.234+0800)

‐XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息

‐Xloggc:F://test//gc.log 日志文件的输出路径

4)、启动程序,GC日志信息解读

G1垃圾收集器 vs CMS垃圾收集器

  • G1不会产生碎片
  • G1可以精准控制停顿,它把整堆划分为多个固定大小的区域,每次根据停顿时间去收集垃圾最多的区域

G1垃圾收集器优化建议

  • 年轻代大小

    • 避免使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小
    • 固定年轻代的大小会覆盖暂停时间目标
  • 暂停时间目标不要太过严苛

    • G1 GC 的吞吐量目标是 90% 的应用程序时间和 10%的垃圾回收时间
    • 评估 G1 GC 的吞吐量时,暂停时间目标不要太严苛。目标太过严苛表示您愿意承受更多的垃圾回收开销,而这会直接影响到吞吐量

可视化GC日志分析工具

1、GC日志输出参数

前面通过-XX:+PrintGCDetails可以对GC日志进行打印,我们就可以在控制台查看,这样虽然可以查看GC的信息,但是并不直观,可以借助于第三方的GC日志分析工具进行查看。 在日志打印输出涉及到的参数如下:

‐XX:+PrintGC 输出GC日志

‐XX:+PrintGCDetails 输出GC的详细日志

‐XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)

‐XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013‐05‐04T21:53:59.234+0800)

‐XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息

‐Xloggc:F://test//gc.log 日志文件的输出路径

测试:

最后生成gc.log,我们利用下面的可视化工具进行分析。

2、GC Easy可视化工具

GC Easy是一款在线的可视化工具,易用、功能强大, GCEasy官网地址:Universal JVM GC analyzer - Java Garbage collection log analysis made easy

打开官网上传gc.log,点击分析即可。分析完之后它会给我们出相关的分析报告,那查看指标如何解读呢?

GC Easy查看gc报告

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/247097.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

激活Windows过程及报错解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上, 运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本

激活Windows过程及报错问题解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上,运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本。 前言 最近在激活Windows过程中,遇到了报错: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上…

超详细 | 哈里斯鹰优化算法原理、实现及其改进与利用(Matlab/Python)

测试函数为F9 在MATLAB中执行程序结果如下: 在Python中执行程序结果如下: 哈里斯鹰优化算法(Harris Hawks Optimization , HHO)是 Heidari等[1]于2019年提出的一种新型元启发式算法,设计灵感来源于哈里斯鹰在捕食猎物过程中的合作行为以及突…

基础算法(3):排序(3)插入排序

1.插入排序实现 插入排序的工作原理是:通过构建有序序列,对于未排序数据,在已经排序的序列从后向前扫描,找到位置并插入,类似于平时打扑克牌时,将牌从大到小排列,每次摸到一张牌就插入到正确的位…

香港威雅报告:香港威雅学校入选英国《优秀学校指南》

今天,我们很荣幸地和大家分享一个特别的消息——香港威雅已接受了英国领先的学校审查机构——《优秀学校指南》(The Good Schools Guide)的全面评审。这是一家值得信赖的权威评审机构,相关工作人员来访并审查了我们的学校&#xf…

【Monitor, Maintenance Operation, Script code/prgramme】

Summary of M,M&O,Program JD) Monitor & M&O Symbio信必优) Job chance/opportunities on Dec 12th, 20231.1) Content 招聘JD job description:1.2) suggestions from Ms Liang/Winnie on Wechat app1.3) Java微服务是什么?1.3.1) [URL Java 微服务](…

网络互通--三层交换机配置

目录 一、三层交换机的原理 1、概念 2、PC A与不同网段的PC B第一次数据转发过程 3、一次路由,多次转发的概念 4、 三层交换机和路由器的比较 二、利用实验理解交换机 1、建立以下拓扑图​编辑 2、分别配置主机的IP地址,子网掩码、网关等信息 3、…

2DPASS激光雷达点云语义分割简介

导读 香港中文大学深圳深度比特实验室提出了一种基于二维图像先验辅助的激光雷达点云语义分割 (2DPASS)。不同于先前的多模态方法(训练和推理阶段均需要成对的图像和点云数据作为输入),该方法仅在训练阶段利用额外的图像数据,从相…

如何关闭微信视频号的详细步骤

随着移动互联网的发展,越来越多的人开始使用各种社交平台来分享自己的生活和工作。而微信作为一款全民级别的应用,自然也不例外。在微信中,除了传统的聊天、朋友圈等功能外,还推出了一个名为“视频号”的功能,可以让用…

54 代码审计-TP5框架审计写法分析及代码追踪

目录 知识点1知识点2演示案例:demo代码段自写和规则写分析hsycms-TP框架-不安全写法-未过滤weipan21-TP框架-规则写法-内置过滤 知识点1 调试,访问,路由,配置,版本等 知识点2 自写写法:自己写代码,一步步…

新闻管理系统

其他项目,点击作者主页 目录 1 系统简介 2 系统相关技术 2.1 Java开发语言 2.1.1 Spring框架 2.1.2 Spring MVC框架 2.1.3 Mybatis框架 2.2 MySQL数据库 3 需求分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 业务流…

C语言-实验题目:运动会成绩模拟统计

实验题目:运动会成绩模拟统计 为推动学校体育工作的开展,计算机科学技术学院将在近期举办院运会。本届运动会只设学生组,比赛项目为田径、游泳、篮球、排球、足球、武术、健美操、兵乓球8项。 名次奖励 田径、游泳、健美操、武术 1&#…

【SpringBoot】Starter的使用与案例讲解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《SpringBoot》。🎯🎯 &…

快速入门Tailwind CSS:从零开始构建现代化界面

快速入门Tailwind CSS:从零开始构建现代化界面 介绍 Tailwind CSS 是一个以原子类的方式快速构建界面的 CSS 框架。它提供了丰富的预定义类,使得开发者能够快速构建样式和布局。 安装和设置 首先,我们需要在项目中安装 Tailwind CSS。可以…

【超详细前后端项目搭建】前端vue3+ts项目(引入ElementPlus、Axios)、后端springboot搭建(创建接口操作mysql数据库)实现前后端联调

目录 前言一、前端项目1、使用vue脚手架创建项目1.1检查vue版本1.2 使用vue脚手架创建项目 2、删除项目多余文件,修改配置项目2.1、删除以下文件2.1、在views下创建index文件2.2、修改router/index.ts路由文件:2.3、修改App.vue文件:2.4、初始…

ElementPlus中的分页逻辑与实现

ElementPlus中的分页逻辑与实现 分页是web开发中必不可少的组件,element团队提供了简洁美观的分页组件,配合table数据可以实现即插即用的分页效果。分页的实现可以分成两种,一是前端分页,二是后端分页。这两种分页分别适用于不同…

C语言:指针与数组易错辨析

前言: 在学校学习指针和数组的联系时,对指针与数组的结合产生了很大的疑惑,后来不断查找资料,本人对指针与数组的综合有了一定的理解,现进行综合讨论辨析 数组指针: 数组指针,即为指向数组类…

【Pytorch】Transposed Convolution

文章目录 1 卷积2 反/逆卷积3 MaxUnpool / ConvTranspose4 encoder-decoder5 可视化 学习参考来自: 详解逆卷积操作–Up-sampling with Transposed Convolution PyTorch使用记录 https://github.com/naokishibuya/deep-learning/blob/master/python/transposed_co…

【改进YOLOv8】车辆测距预警系统:融合空间和通道重建卷积SCConv改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义: 随着交通工具的普及和道路交通的不断增加,车辆安全问题日益凸显。特别是在高速公路等高速道路上,车辆之间的距离和速度差异较…

java-两个列表进行比较,判断那些是需要新增的、删除的、和更新的

文章目录 前言两个列表进行比较,判断那些是需要新增的、删除的、和更新的 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实…

计算机网络编程 | 并发服务器代码实现(多进程/多线程)

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…