垃圾回收器

news2024/11/18 14:45:37

文章目录

      • 1. 垃圾回收器分类
      • 2. 不同垃圾回收器概述
      • 3. Serial与Serial Old垃圾回收器:串行回收
      • 4. ParNew垃圾回收器:并行回收
      • 5. Parallel与Parallel Old垃圾回收器:吞吐量优先
      • 6. CMS回收器:低延迟
      • 7. G1回收器:区域分代式
      • 8. 垃圾回收器总结
      • 9. GC日志分析
      • 10. 垃圾回收器的新发展

1. 垃圾回收器分类

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
评估GC的性能指标
在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2. 不同垃圾回收器概述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
jdk8中,UseParallelGC默认搭配UseParallelOldGC

修改idea中程序运行的JDK版本
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

3. Serial与Serial Old垃圾回收器:串行回收

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

4. ParNew垃圾回收器:并行回收

在这里插入图片描述
ParNew底层与Serial共用了大量的代码
在这里插入图片描述在这里插入图片描述在这里插入图片描述

5. Parallel与Parallel Old垃圾回收器:吞吐量优先

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

6. CMS回收器:低延迟

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

7. G1回收器:区域分代式

在这里插入图片描述在这里插入图片描述在这里插入图片描述G1回收器的特点(优势)
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述G1回收器的缺点:
在这里插入图片描述G1回收器的参数设置
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述Bump:
单个Region使用指针碰撞的方式来放数据上面allocated是已经使用的内存空间,top就是指针的位置,unallocate是没有使用的内存空间
TLAB:
虽然存在分区Region,但是依然有线程独有的TLAB空间,这样可以保证多个线程对对象修改可以并行操作
在这里插入图片描述在这里插入图片描述在这里插入图片描述Remebered Set
在这里插入图片描述在这里插入图片描述G1回收过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

8. 垃圾回收器总结

在这里插入图片描述在这里插入图片描述在这里插入图片描述CMS是在JDK9被废弃。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

/**
 *  -XX:+PrintCommandLineFlags
 *
 *  -XX:+UseSerialGC:表明新生代使用Serial GC ,同时老年代使用Serial Old GC
 *
 *  -XX:+UseParNewGC:标明新生代使用ParNew GC
 *
 *  -XX:+UseParallelGC:表明新生代使用Parallel GC
 *  -XX:+UseParallelOldGC : 表明老年代使用 Parallel Old GC
 *  说明:二者可以相互激活
 *
 *  -XX:+UseConcMarkSweepGC:表明老年代使用CMS GC。同时,年轻代会触发对ParNew 的使用
 * @author shkstart  shkstart@126.com
 * @create 2020  0:10
 */
public class GCUseTest {
    public static void main(String[] args) {
        ArrayList<byte[]> list = new ArrayList<>();
        while(true){
            byte[] arr = new byte[100];
            list.add(arr);
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

9. GC日志分析

在这里插入图片描述下面两种是等价的
-Xms60m -Xmx60m -XX:+PrintGC
-Xms60m -Xmx60m -verbose:gc

public class GCLogTest {
    public static void main(String[] args) {
        ArrayList<byte[]> list = new ArrayList<>();
        for (int i = 0; i < 500; i++) {
            byte[] arr = new byte[1024 * 100];//100KB
            list.add(arr);
    }
}
[GC (Allocation Failure)  15289K->13782K(58880K), 0.0044617 secs]
[GC (Allocation Failure)  29081K->29184K(58880K), 0.0046940 secs]
[Full GC (Ergonomics)  29184K->28807K(58880K), 0.0102882 secs]
[Full GC (Ergonomics)  44125K->43710K(58880K), 0.0060180 secs]

GC、Full GC: GC的类型,GC只在新生代上进行,Full GC包括永生代,新生代,老年代。
Allocation Failure: GC发生的原因。
15289K->13782K:堆在GC前的大小和GC后的大小
58880K:总共的堆大小。
0.0044617 secs: GC持续的时间。

-Xms60m -Xmx60m -XX:+PrintGCDetails

[GC (Allocation Failure) [PSYoungGen: 15282K->2548K(17920K)] 15282K->13874K(58880K), 0.0417173 secs] [Times: user=0.00 sys=0.00, real=0.04 secs] 
[GC (Allocation Failure) [PSYoungGen: 17847K->2500K(17920K)] 29173K->29028K(58880K), 0.0073599 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2500K->0K(17920K)] [ParOldGen: 26528K->28807K(40960K)] 29028K->28807K(58880K), [Metaspace: 3495K->3495K(1056768K)], 0.0135070 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
[Full GC (Ergonomics) [PSYoungGen: 15318K->3000K(17920K)] [ParOldGen: 28807K->40709K(40960K)] 44126K->43710K(58880K), [Metaspace: 3496K->3496K(1056768K)], 0.0167859 secs] [Times: user=0.00 sys=0.02, real=0.02 secs] 
Heap
 PSYoungGen      total 17920K, used 10253K [0x00000000fec00000, 0x0000000100000000, 0x0000000100000000)
  eden space 15360K, 66% used [0x00000000fec00000,0x00000000ff603510,0x00000000ffb00000)
  from space 2560K, 0% used [0x00000000ffd80000,0x00000000ffd80000,0x0000000100000000)
  to   space 2560K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x00000000ffd80000)
 ParOldGen       total 40960K, used 40709K [0x00000000fc400000, 0x00000000fec00000, 0x00000000fec00000)
  object space 40960K, 99% used [0x00000000fc400000,0x00000000febc17f0,0x00000000fec00000)
 Metaspace       used 3502K, capacity 4498K, committed 4864K, reserved 1056768K
  class space    used 387K, capacity 390K, committed 512K, reserved 1048576K

GC, Full GC:同样是GC的类型
Allocation Failure: GC原因
PsYoungGen:使用了Parallel Scavenge并行垃圾收集器的新生代GC前后大小的变化
ParOldGen:使用了Parallel Old并行垃圾收集器的老年代GC前后大小的变化
Metaspace:元数据区GC前后大小的变化,JDK1.8中引入了元数据区以替代永久代
secs: 指GC花费的时间
Times: user:指的是垃圾收集器花费的所有CPu时间
sys:花费在等待系统调用或系统事件的时间
real:GC从开始到结束的时间,包括其他进程占用时间片的实际时间。

-Xms60m -Xmx60m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps

2022-12-16T23:07:42.172+0800: 0.260: [GC (Allocation Failure) [PSYoungGen: 15282K->2544K(17920K)] 15282K->13894K(58880K), 0.0420238 secs] [Times: user=0.00 sys=0.00, real=0.04 secs] 
2022-12-16T23:07:42.213+0800: 0.270: [GC (Allocation Failure) [PSYoungGen: 17843K->2536K(17920K)] 29193K->29112K(58880K), 0.0083888 secs] [Times: user=0.01 sys=0.13, real=0.02 secs] 
2022-12-16T23:07:42.229+0800: 0.278: [Full GC (Ergonomics) [PSYoungGen: 2536K->0K(17920K)] [ParOldGen: 26576K->28807K(40960K)] 29112K->28807K(58880K), [Metaspace: 3494K->3494K(1056768K)], 0.0184285 secs] [Times: user=0.09 sys=0.00, real=0.01 secs] 
2022-12-16T23:07:42.244+0800: 0.301: [Full GC (Ergonomics) [PSYoungGen: 15318K->3000K(17920K)] [ParOldGen: 28807K->40709K(40960K)] 44125K->43710K(58880K), [Metaspace: 3495K->3495K(1056768K)], 0.0148117 secs] [Times: user=0.05 sys=0.06, real=0.02 secs] 

2022-12-16T23:07:42.172+0800: -XX:+PrintGCDateStamps 参数打印的,表示当前打印的时间戳
0.260:-XX:+PrintGCTimeStamps 参数打印的,表示JVM启动了多久。

在这里插入图片描述在这里插入图片描述GC真正耗时:real

在这里插入图片描述
在这里插入图片描述

/**
 * 在jdk7 和 jdk8中分别执行
 * -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseSerialGC
 * @author shkstart  shkstart@126.com
 * @create 2020  0:12
 */
public class GCLogTest1 {
    private static final int _1MB = 1024 * 1024;

    public static void testAllocation() {
        byte[] allocation1, allocation2, allocation3, allocation4;
        allocation1 = new byte[2 * _1MB];
        allocation2 = new byte[2 * _1MB];
        allocation3 = new byte[2 * _1MB];
        allocation4 = new byte[4 * _1MB];
    }

    public static void main(String[] agrs) {
        testAllocation();
    }
}

在这里插入图片描述JDK7中
在这里插入图片描述在这里插入图片描述JDK8中

[GC (Allocation Failure) [DefNew: 6431K->695K(9216K), 0.0084041 secs] 6431K->4791K(19456K), 0.0085389 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 def new generation   total 9216K, used 7161K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  eden space 8192K,  78% used [0x00000000fec00000, 0x00000000ff2506b0, 0x00000000ff400000)
  from space 1024K,  67% used [0x00000000ff500000, 0x00000000ff5adf38, 0x00000000ff600000)
  to   space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)
 tenured generation   total 10240K, used 4096K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
   the space 10240K,  40% used [0x00000000ff600000, 0x00000000ffa00020, 0x00000000ffa00200, 0x0000000100000000)
 Metaspace       used 3500K, capacity 4498K, committed 4864K, reserved 1056768K
  class space    used 387K, capacity 390K, committed 512K, reserved 1048576K

可以看出老年代占了40%,也就是4M,相当于大对象在Eden区放不下后直接放到了老年代,但是JDK7中不是,是把Eden区中的对象升级到老年代,然后把大对象分配在Eden区
在这里插入图片描述
在这里插入图片描述GCViewer就是一个jar包,点击就能运行,但是页面不能调节,分辨率不适配,很难用。
GCEasy

-Xms60m -Xmx60m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:./logs/gc.log

public class GCLogTest {
    public static void main(String[] args) {
        ArrayList<byte[]> list = new ArrayList<>();

        for (int i = 0; i < 500; i++) {
            byte[] arr = new byte[1024 * 100];//100KB
            list.add(arr);
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

./指的是当前目录,即当前工程总目录,下的logs文件夹下的gc.log,将其复制到桌面,然后上传到GCeasy分析一下。
在这里插入图片描述

10. 垃圾回收器的新发展

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

注:本文是学习 尚硅谷宋红康JVM全套教程(详解java虚拟机)所做笔记。

如何超越聪明且勤奋的人?
深思熟虑选择对的方向,早早入行,持续不断地努力。
1)选择永远比努力重要
高考分数比你低的同学去学了计算机,你分数高反而去了四大天坑两大护法中的某个专业,人家毕业月入过万,你月薪四五千。
2)早就是优势
比你早进公司的人或许能力不如你,但当你去的时候人家已经是领导了,你能力再强也是下属,也是被人领导的。论资排辈永远存在。当然,站队也比能力重要,或者说站队是一种被人忽视的实则十分重要的能力,裁员肯定先裁杂牌军,不会论你能力如何,嫡系永远最后被裁。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web前端-javascript-初识Array数组(说明,初步创建,添加元素和读取元素,获取和修改数组的 length 长度,最后一个位置添加元素)

初识 Array 数组 1. 说明 数组也是一个对象它和普通的对象功能类似&#xff0c;也是用来存储一些值的不同的是普通对象是使用字符串作为属性名的 而数组是使用数字来作为索引来操作元素 索引&#xff1a; 从 0 开始的整数就是索引 数组的存储性能比普通对象要好&#xff0c;在…

【记录】Ubuntu20.04安装CUDA和cuDNN

本文记录下如何在Ubuntu20.04系统中安装CUDA和cuDNN。 这里简要介绍下CUDA和cuDNN分别是什么。CUDA 是 NVIDIA 发明的一种并行计算平台和编程模型。它通过利用图形处理器 (GPU) 的处理能力&#xff0c;可大幅提升计算性能&#xff1b;cuDNN(深度神经网络库)是GPU加速的用于深度…

《西西弗神话》笔记——不期待人生可以过得很顺利,但我希望碰到人生难关的时候,自己可以是它的对手

目录 一、作者生平 二、经典摘录 1、悲剧从本质上讲是对苦难的反抗 2、自杀实质上是一种逃避&#xff0c;它是反抗的对立面 3、不是否认生活本身 4、书的宗旨就是要讨论荒谬与自杀的关系 5、真正严肃的哲学问题只有一个&#xff1a;自杀 6、了解人是否能够义无反顾地生…

【2022.12.16】备战春招Day11——每日一题 + 142. 环形链表 II + 93. 复原 IP 地址

【每日一题】 1785. 构成特定和需要添加的最少元素 题目描述 给你一个整数数组 nums &#xff0c;和两个整数 limit 与 goal 。数组 nums 有一条重要属性&#xff1a;abs(nums[i]) < limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的最少元素数量 &#xff0c;添…

SQL语句练习05

目录 一、建表并插入数据 二、查询语句练习 一、建表并插入数据 一、建立如下 &#x1d446; 表(命名格式“姓名拼音_三位学号_week7s”&#xff0c;如LBJ_023_week7s&#xff09;&#xff0c;并插入数据 create table LYL_116_week7s(SNO varchar(3),SNAME varchar(10), CI…

【数据结构Java版】Stack栈的妙用

目录 一、栈的概念 二、栈的使用 &#xff08;1&#xff09;主要方法 &#xff08;2&#xff09;实例演示 三、栈的模拟实现 四、栈相关练习题 &#xff08;1&#xff09;有效的括号 &#xff08;2&#xff09;栈的压入、弹出序列 &#xff08;3&#xff09;逆波兰表达…

SpringBoot中mapper-locations配置多个mapper包路径

1 问题描述 大家都知道mapper-locations是配置mapper路径的&#xff0c;但是有时候mapper路径可能不止一个 比如说有两个包A和B&#xff0c;A和B里面的业务模块不同就需要写各自的mapper&#xff0c;这时候如果只配置A的mapper路径&#xff0c;那么B的mapper路径肯定扫码不到…

无法打开jupyter notebook

无法打开jupyter notebook遇到的问题问题分析tornado什么是tornado?如何更新tornado问题解决解决方法一解决方法二参考资料遇到的问题 今天打开anaconda prompt的时候想要打开jupyter notebook,但是遇到的了如下报错: Traceback (most recent call last): File “C:\ProgramD…

C++ Reference: Standard C++ Library reference: Containers: map: multimap: begin

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/multimap/begin/ 公有成员函数 <map> std::multimap::begin C98 iterator begin(); const_iterator begin() const; C11 iterator begin() noexcept; const_iterator begin() const noexcept;返回指向开…

python tkinter实现文本编辑器

题目 请设计并实现一款文本编辑器。程序允许用户打开、保存文本文件。 例如&#xff1a; 在用户打开文件时&#xff0c;会呈现打开文件对话框&#xff0c; 在用户保存文件时&#xff0c;会呈现保存为对话框 当打开文件出错时&#xff0c;程序不会崩溃&#xff0c;而是会提示…

【Python】CSV,TSV语料读取的简单操作——内建包csv的使用

背景 在做文本相关的任务时&#xff0c;难免会遇见csv&#xff0c;tsv等格式的数据&#xff0c;但有时只是读取&#xff0c;然后传入到下一个任务中而已&#xff0c;并不会做过多的操作。在这种情况下&#xff0c;可以使用pandas读取&#xff0c;但是难免有些臃肿&#xff0c;…

切记不要接受任何降薪,不要同意任何调岗,更不要害怕HR威胁背调,跟HR聊天都要录音!...

最近很多人都遭遇了裁员和降薪&#xff0c;一位网友给大家提出了几点建议&#xff1a;1.不要接受任何降薪&#xff0c;不要签字同意。如果公司敢降薪就直接去仲裁&#xff0c;但如果签字之后&#xff0c;降薪就属于你情我愿了。2.不要签字同意调岗&#xff0c;调岗会不会有薪水…

【博客559】更出色的网络监控采集方案---Telemetry(遥测技术)

网络监控方案—Telemetry(遥测技术) 1、几种不同采集方式对比&#xff1a;CLI&#xff0c;SNMP&#xff0c;SYSLOG&#xff0c;Telemetry CLI&#xff1a; 作为应用最广使用最久的网络监控技术&#xff0c;最大的问题就是兼容性&#xff0c;同类产品不同厂商之间的兼容性&…

web前端-javascript-创建Array数组和元素类型(字面量创建,构造函数创建,元素可以是任意数据类型,二维数组)

文章目录创建 Array 数组1. 普通方法2. 使用字面量来创建数组3. 使用构造函数来创建数组数组的元素类型1. 创建一个长度为 10 的数组2. 数组中的元素可以是任意的数据类型2.1. 数组中的元素也可以是对象2.2. 也可以是一个函数2.3. 数组中也可以放数组,如下这种数组我们称为二维…

早餐店+饮品+烘焙,如何做多群体早中晚生意?

早餐吃好、午餐吃饱、晚餐少吃&#xff0c;如今早餐店已经不再局限于豆浆油条、鸡蛋面包&#xff0c;同时还有饮品&#xff0c;芳芳珍早鲜奶店是一家早餐店&#xff0c;30个SKU销量很高&#xff0c;一天中有近75%的销售都集中在早餐场景。 这家早餐店是如何做的&#xff1f; 01…

【交通标志识别】BP神经网络交通标志识别(带面板)【含GUI Matlab源码 1647期】

⛄一、BP神经网络交通标志识别简介 道路交通标志用以禁止、警告、指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复杂, 且智能识别技术尚未成熟, 为了得到高效实用的道路标志识别系统, …

笔试训练(2)

// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {StringBuffer s1new StringBuffer("A");StringBuffer s2new StringBuffer("B");process(s1,s2);System.out.println(s1);System.out.pr…

推翻OpenAI结论,DeepMind重新定义预训练的参数和规模关系!

文&#xff5c;王思若前言从20年开始&#xff0c;“最大语言模型”的桂冠被各大研究机构和科技公司竞相追逐&#xff0c;堆砌参数&#xff0c;猛上算力&#xff0c;开启了“大炼丹”时代&#xff0c;模型参数量仿佛越大越好&#xff0c;甚至GPT-4模型参数量将超过100万亿的传闻…

14年本科毕业,3个月转行软件测试月薪13.5k,32的岁我终于找对了方向

​职场奋斗的过程&#xff0c;其实就是不停地做选择&#xff0c;做判断的过程。决定你发展的&#xff0c;多数取决于你的判断和眼光。你任何的投入&#xff0c;都决定了你未来的格局和结局。今天跟大家分享的我的转行故事&#xff0c;一起来看看吧。 为了新的目标和方向&#x…

PDF怎么拆分/合并? 3款 PDF 拆分和合并工具分享

以PDF格式传输文档已广泛使用很长时间&#xff0c;也是传输文档的最常见方式之一。但是&#xff0c;当涉及到从众多PDF文件中提取特定页面并将它们放在一起以制作新的PDF文档时&#xff0c;我们将需要专用软件来合并和拆分多个PDF。 现在&#xff0c;如果您想知道&#xff0c;…