JVM系统优化实践(5):什么时候GC以及有哪些GC

news2024/9/24 6:20:41

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~


既然程序运行会产生大量的废弃物,也就是「垃圾」,那总不能一直堆着不管吧。现在就来粗浅地谈谈Java里面什么时候会触发GC以及有哪些GC。

通过之前的电商支付系统,可以知道系统运行创建的对象都是优先分配在JVM的年轻代中的,年轻代里面的对象越来越多快满的时候就会触发垃圾回收机制。

这就涉及到一个「可达性分析法」,也就是判定哪些对象可以被回收,哪些不能被回收:只要某个对象被局部变量引用,就说明该对象有一个GC Roots,此时就不能被回收了。

所谓GC Roots,在一般情况下指的是方法的局部变量和静态变量。只要对象被方法的局部变量、静态变量给引用了,它就不能被回收了,至少不能被马上回收。

Java对象有几种不同的引用类型:

1、强引用:一个变量显式地引用一个对象;

2、软引用:对一个匿名内部类或者对引用的引用,例如:

// 强引用

String str = new String(“abc”);

// 软引用

SoftReference<String> softref = new SoftReference<String>(str);

// 也是软引用

SoftReference<String> softref = new SoftReference<String>(new String(“abc”));

3、弱引用:只具有弱引用的对象拥有更短暂的生命周期,例如:

// 弱引用

WeakReference<String> weakref = new WeakReference<String>(new String(“abc”));

str = null;

4、虚引用:顾名思义,就是形同虚设,实际中很少使用,可以不管。

再来看看有哪些GC方法。

年轻代的内存被分为两部分,其中一块创建对象实例,供栈中的局部变量引用。当空间不足时,就可能触发年轻代的垃圾回收:

由于一瞬间回收掉大量垃圾对象时,可能会造成大量的空白内存区域,大小不一,非常凌乱,造成大量的内存浪费,因此不能直接清除垃圾对象而保留存活对象。所以合理的做法就是复制(复制算法):

1、先保留存活对象;

2、再将存活对象转移(复制)到另一块空白内存中;

3、最后将原区域整体回收;

4、两块区域循环往复着使用。

这就是GC当中最最简单、最最基础的复制算法。

它的缺点是:空间使用效率只有50%。从图上可以明显看得出来,比较浪费,空间越大越浪费。

优化:将年轻代划分为三块:

1、1个Eden区:占80%年轻代空间;

2、2个Survivor区:S0、S1各占10%年轻代空间;

平常情况下可以使用的,就是Eden区和其中一块Survivor区(比如S0):

如果Eden区快满了,就会触发Minor GC:

1、Minor GC时,Eden中的存活对象会一次性转移到另一块空闲的Survivor区中区(比如S1);

2、Eden区被清空,然后被再次分配新对象;

3、如果Eden再满,再次触发Minor GC;

4、将Eden和S1中的存活对象转移到S0中去;

5、如此循环往复。

对象不可能永远年轻,总会慢慢变老。自然世界用光阴让人两鬓斑白,JVM则默默记住对象的「劫数」,并以此决定它的生死:

对象每在年轻代“躲过”一次GC而被转移到另一个Survivor时,对象“年龄”就会增加“一岁”(被标记一次),默认是被标记15次之后,就会被转移到老年代,可通过-XX:MaxTenuringThreshold参数设置。

当然计算机世界还有自己的规则——除了被标记,还有另一个规则可让对象进入老年代——如果当前Survivor区中,年龄相同的一批对象总大小 ≥ Survivor × 50%,那么这批对象及比它们年龄更大的对象,就都直接进入老年代。例如:如果年龄1 + 年龄2 + 年龄3 ≥ Survivor × 50%,那么大于等于年龄3的所有对象都进入老年代。

计算机的规则只有工程师可以干预:通过设置参数XX:PretenureSizeThreshold的值,可以直接将大对象放到老年代,根本就不经过年轻代。

工程师就是计算机的上帝!


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

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

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

相关文章

NBA Top Shot 跌落神坛

近日&#xff0c;美国职业篮球联盟&#xff08;NBA&#xff09;授权的NFT 项目“NBA Top Shot Moments”被纽约法院初步裁定为“可能符合证券的定义”&#xff0c;虽然这不是对2021年用户指控该项目违法的最终判决&#xff0c;但这个裁定引发了市场担忧&#xff0c;部分NFT的地…

Java的运算操作

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【JavaSE_primary】 文章目录算术运算符增量运算符注意自增自减运算符关系运算符逻辑运算符逻辑与&&逻辑或||逻辑非&#xff01;…

直觉外科:手术机器人领域的领导者,未来还有巨大的增长空间

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 虽然直觉外科(ISRG)多年来一直在强劲的增长&#xff0c;但猛兽财经认为它未来仍有足够的空间进一步扩大收入和利润。虽然这个行业的竞争正在加剧&#xff0c;但猛兽财经认为从长远来看&#xff0c;这个市场可能会整合&…

如何修改JAR包内的代码

有时候由于找不到源码&#xff0c;只有一个jar包&#xff0c;但又想去修改jar包中的代码&#xff0c;就可以进行将jar包反编译后&#xff0c;修改&#xff0c;再重新编译的方式来实现。 一、下载反编译软件JD-GUI https://github.com/java-decompiler/jd-gui/releases 二、用…

Android 项目必备(四十二)-->Android 多窗口模式

简介 自由窗口模式: 该模式类似于常见的桌面操作系统&#xff0c; 应用界面的窗口可以自由的拖动和修改大小。 分屏模式 该模式可以在手机上使用&#xff0c; 该模式将屏幕一分为二&#xff0c; 同时显示两个应用界面。 画中画模式: 该模式主要用于TV&#xff0c; 在该模式下…

项目--基于RTSP协议的简易服务器开发(1)

RTSP协议简介&#xff1a;RTSP&#xff08;Real Time Streaming Prcotol&#xff09;是位于TCP\IP体系应用层的数据传输协议&#xff0c;通常的RTSP协议包含 RTSP、RTP、RTCP协议。一般而言&#xff1a;RTSP负责服务器与客户端之间的请求与响应RTP负责服务器、客户端之间传输媒…

【双U网络:传感器间自监督:全色锐化】

W-NetPan: Double-U network for inter-sensor self-supervised pan-sharpening &#xff08;W-NetPan&#xff1a;用于传感器间自监督全色锐化的双U网络&#xff09; 由于遥感数据的提供日益增多&#xff0c;可以通过全色锐化方法来处理空间-光谱限制。然而&#xff0c;融合…

【JavaGuide面试总结】操作系统篇·上

【JavaGuide面试总结】操作系统篇上1.什么是系统调用呢&#xff1f; 能不能详细介绍一下2.进程和线程的区别3.进程有哪几种状态?4.进程间的通信常见的的有哪几种方式呢?5.线程间的同步的方式有哪些呢?6.操作系统中进程的调度算法有哪些7.产生死锁的四个必要条件是什么?8.解…

KT148A语音芯片ic的供电电压以及电源输入的详细说明V1

目录 一、问题简介 二、详细说明 问题1&#xff1a;芯片的供电说明 问题2&#xff1a;我测试反而3.7V接到KT148A的7脚才能工作&#xff0c;正常吗&#xff1f; 问题3&#xff1a;分别测试了锂电池和USB供电&#xff0c;都不正常&#xff1f; 三、总结 完整的测试板如下图…

大型WMS系统源码 带扫码入库移动端源码

WMS的核心价值是降低成本&#xff0c;提高效率&#xff0c;能够反映和控制仓库各个环节的运作&#xff0c;实现事件前后的管理&#xff0c;为企业创造更高的效益。 WMS系统是智能仓库管理系统的缩写&#xff0c;WMS系统主要负责的是入库业务、出库业务、仓库调拨、库存调拨和虚…

Raspberry实践笔记—配置RobotFramework自动化测试环境

一般RobotFramework都是安装在Windows&#xff0f;Linux的PC机上&#xff0c;这里将简单介绍在树莓派硬件平台上配置RobotFramework的开发和运行环境。 树莓派上配置了自动化测试软件&#xff0c;可以考虑用多个这个廉价的“计算机”&#xff0c;开展并行的测试用例执行。成倍…

每日分享(免登录积分商城系统 动力商城 兑换商城源码)

​demo软件园每日更新资源,请看到最后就能获取你想要的: 1.Python教程2022&#xff1a;100天从新手到大师 完整版 Python 100天从新手到大师是一个Python入门教程&#xff0c;Python从入门到精通&#xff0c;专门为热爱python的新手量身定做的学习计划&#xff0c;100天速成pyt…

C++类和对象:拷贝构造函数和运算符重载

目录 一. 拷贝构造函数 1.1 什么是拷贝构造函数 1.2 编译器默认生成的拷贝构造函数 1.3 拷贝构造函数特性总结 二. 运算符重载 2.1 运算符重载概述 2.2 比较运算符重载&#xff08;> > < <&#xff09; 2.2.1 >运算符的重载 2.2.2 运算符的重载 2.…

面对海量的监控视频数据应该如何存储?

面对有些行业及工作特殊性&#xff0c;监控摄像头是必不可免的&#xff0c;面对成千上万的摄像头&#xff0c;每时每秒产生的视频数据&#xff0c;选择一个合理的存储方式&#xff0c;将会为您节省一大笔费用。而且&#xff0c;有些监控摄像头视频数据还需要按照国家要求存储30…

SpringCloud OpenFeign 源码分析

前言 由于公司正在高sky迁移&#xff0c;我们部门的老应用SpringBoot 1.x升级2.x&#xff0c;其中老的Neflix Feign也升级成了Spring Cloud OpenFeign&#xff0c;由于业务条线的各种高低版本以及服务之间调用等存在一些兼容性问题&#xff0c;于是看了下OpenFeign的源码&#…

【Web逆向】某津市公共资源交易平台链接加密分析

【Web逆向】某津市公共资源交易平台链接加密分析声明一、起因二、开始分析三、源码下载地址声明 本文章中所有内容仅供学习交流&#xff0c;相关链接做了脱敏处理&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 一、起因 好奇抓取 天津市公共资源交易平台 的…

这个WPF DataGrid组件,可以让业务数据管理更轻松!(Part 1)

DevExpress WPF的DataGrid组件是专用于WPF平台的高性能XAML网格控件&#xff0c;该组件附带了几十个具有高影响力的功能&#xff0c;使开发者可以轻松地管理数据并根据也无需要在屏幕上显示数据。PS&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚…

Telerik JustMock 2023 R1 Crack

Telerik JustMock 2023 R1 Crack 制作单元测试的最快、最灵活和模拟选项。 Telerik JustLock也很简单&#xff0c;可以使用一个模拟工具来帮助您更快地生成更好的单元测试。JustLock使您更容易创建对象并建立对依赖关系的期望&#xff0c;例如&#xff0c;互联网服务需求、数据…

常用的xpath

一、xpath 语法 简单看一下菜鸟教程即可 1、基本语法 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式&#xff1a; 表达式描述nodename选取此节点的所有子节点。/从根节点选取&#xff08;取子节点&#…

数据挖掘(1)--基础知识学习

前言 自20世纪90年代以来&#xff0c;随着数据库技术应用的普及&#xff0c;数据挖掘&#xff08; Data Mining &#xff09;技术已经引起了学术界、产业界的极大关注&#xff0c;其主要原因是当前各个单位已经存储了超大规模&#xff0c;即海量规模的数据&#xff0c;未来能够…