Java之GC机制

1 JVM基本结构

1)类加载器classLoader:在JVM启动时或者类运行时将需要的.class文件加载到内存中

2)内存区域(运行时数据区): 是在JVM运行的时候操作所分配的内存区

3)执行引擎:负责执行class文件中包含的字节码指令

4)本地方法接口:主要是调用C/C++实现的本地方法及返回结果

 

 

 

 

 

2 JVM内存结构

1 )  方法区:用于存储类结构信息的地方,包括常量池、静态变量、构造函数等。

2) Java堆(heap):存储Java实例或者对象的地方。这块是gc的主要区域

3) Java栈(stack):Java栈总是和线程关联的,每当创建一个线程时,JVM就会为这个线程创建一个对应的Java栈。在这个java栈中又会包含多个栈帧,每运行一个方法就创建一个栈帧,用于存储局部变量表、操作栈、方法返回值等。每一个方法从调用直至执行完成的过程,就对应一个栈帧在java栈中入栈到出栈的过程。所以java栈是线程私有的

4)程序计数器:用于保存当前线程执行的内存地址,由于JVM是多线程执行的,所以为了保证线程切换回来后还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的

5)本地方法栈:和Java栈的作用差不多,只不过是为JVM使用到的native方法服务的

 

 

 

 

 

3 Java对象引用

Java对象的引用可以分为4类:强引用、软引用、弱引用和虚引用

1)强引用:通常可以认为是通过new出来的对象,即使内存不足,GC进行垃圾收集的时候也不会主动回收。

Object obj = new Object();

2)软引用:在内存不足的时候,GC进行垃圾收集的时候会被GC回收

Object obj = new Object();
SoftReference<Object> softReference = new SoftReference<>(obj);

3)弱引用:无论内存是否充足,GC进行垃圾收集的时候都会回收

Object obj = new Object();
WeakReference<Object> weakReference = new WeakReference<>(obj);

4)虚引用:和弱引用类似,主要区别在于虚引用必须和引用队列一起使用

Object obj = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomReference = new PhantomReference<>(obj, referenceQueue);

引用队列:如果软引用和弱引用被GC回收,JVM就会把这个引用加到引用队列里,如果是虚引用,在回收前就会被加到引用队列里。

 

 

 

 

 

 

 

4 GC机制

垃圾收集器一般完成两件事->检测出垃圾->回收垃圾

1) 对象的年龄相关知识

对象的年龄,如果在一次垃圾回收过程中有使用该对象的,则将对象年龄加1,否则减1,当计数为0,则进行回收,如果年龄达到一定数字则进入老生代。总的来说内存分配机制主要体现在对象创建之后是否仍在使用,已经不使用的则回收,继续使用的则对其年龄进行更新,达到一定程度,转移到年老代。

下图所示是堆中内存分配示意图,创建一个对象,首先会在eden区域分配区域,如果内存不够,就会将年龄大的转移到Survivor区,当survivor区域存储不下,则会转移年老代的。对于一些静态变量不需要使用对象,直接调用的,则会被放入永生代。一般来说长期存活的对象最终会被存放到年老代还有一种特殊情况也会被存放到年老代,就是创建大对象时,比如数据这种需要申请连续空间的,如果空间比较大的,则会直接进入年老代

 

2) 垃圾检测方法

  • 引用计数法给每个对象添加引用计数器,每个地方引用它,计数器就+1,失效时-1。如果两个对象互相引用时,就导致无法回收
  •  可达性分析算法以根集对象为起始点进行搜索,如果对象不可达的话就是垃圾对象。根集(Java栈中引用的对象、方法区中常量池中引用的对象、本地方法中引用的对象等。JVM在垃圾回收的时候,会检查堆中所有对象是否被这些根集对象引用,不能够被引用的对象就会被垃圾回收器回收。)

 

 

3) 垃圾回收算法

  • 标记-清除:首先标记所有需要回收的对象,在标记完成之后统计回收所有被标记的对象,它的标记过程即为上面的可达性分析算法,清除所有被标记的对象,缺点:效率不足,标记和清除效率都不高,空间问题,标记清除之后会产生大量不连续的内存碎片,导致大对象分配无法找到足够的空间,提前进行垃圾回收

  •  复制算法:复制算法将可用的内存分成两份,每次使用其中一块,当这块回收之后把未回收的复制到另一块内存中然后把使用的清除。这种算法运行简单,解决了标记-清除算法的碎片问题,但是这种算法代价过高,需要将可用内存缩小一半,对象存活率较高时,需要持续的复制工作,效率比较低 优点:保证了空间的连续性,又避免了大量的内存空间浪费.
  •  标记-整理算法:标记过程与标记-清除的标记一样,但后续不是对可回收对象进行清理,而是让所有的对象都向一端移动,然后直接清理掉端边界以外的内存。样既可以避免不连续空间出现,还可以避免对象存活率较高时的持续复制。这种算法适合老生代。
  •  分代收集算法:  分代收集算法就是目前虚拟机使用的回收算法,它解决了标记整理不适用于老年代的问题,将内存分为各个年代,在不同年代使用不同的算法,从而使用最合适的算法,新生代存活率低,可以使用复制算法。而老年代对象存活率高,没有额外空间对它进行分配担保,所以使用标记整理算法

 

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

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

相关文章

《零基础看得懂的C语言入门教程 》——(一)脱离学习误区

本节视频连接&#xff1a; https://www.bilibili.com/video/BV1Qv411t7ae 新手C语言学习有些误区你应该知道&#xff0c;这样学习起来事半功倍~一、前言 距离上一次编写C语言的教程是5年前了&#xff08;2015年&#xff09;&#xff0c;由于自己是从初一时开始学习编程&#…

一套完整的导视设计案例_色彩导视艺术:乌克兰基辅语言学校导视设计案例

学校导视设计案例建筑师Emil Dervish为乌克兰基辅Underhub语言学校设计了色彩缤纷的导视系统&#xff0c;该设计灵感来源于伦敦地铁&#xff0c;他希望通过彩色线条的大胆应用来营造轻松而欢乐的氛围。让我们一起来看看这座由“彩虹”做导视的学校。彩虹导视设计跟着红色导视线…

C# 创建匿名管道

下面对匿名管道执行类似的操作。通过匿名管道&#xff0c;创建两个彼此通信的任务。为了给管道的创建发出信号&#xff0c;使用 ManualResetEventSlim 对象&#xff0c;与内存映射文件一样。在 Program 类的 Run 方法中&#xff0c;创建两个任务&#xff0c;调用 Reader 和 Wri…

内测投票

create table DiaoYanTiMu &#xff08;  Ids int(10) auto_increment not null primary key(),//把所需要的都写上中间不需要符号隔开&#xff0c;设自增长列类型必须是int&#xff0c;主键的话必须不能为空not null&#xff0c; Title varchar(50) not null &#xff09;;/…

Mysql 查询统计练习

2019独角兽企业重金招聘Python工程师标准>>> 1、建表 customers 顾客表 products 产品表 orders 订单表 -- 顾客表 CREATE TABLE customers (c_id INT NOT NULL AUTO_INCREMENT,lastname VARCHAR(255),firstname VARCHAR(255),address VARCHAR(255),birthday DATETI…

C++11模版元编程的应用

1.概述 关于C11模板元的基本用法和常用技巧&#xff0c;我在程序员2015年2月B《C11模版元编程》一文&#xff08;后称前文&#xff09;中已经做了详细地介绍&#xff0c;那么C11模版元编程用来解决什么实际问题呢&#xff0c;在实际工程中又该如何应用呢&#xff1f;本文将侧重…

《零基础看得懂的C语言入门教程 》——(二)C语言没那么难简单开发带你了解流程

一、学习目标 了解DevC集成开发环境了解集成开发环境了解HelloWorld程序了解HelloWorld程序的编写方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第二篇&#xff1…

11选5下期算法_本周六周日【高二直播】辅导网课预告:通用技术电控二三极管、多用电表测量、数字逻辑电路、解析枚举递归算法,2022浙江选考技术...

01第19-21讲 2020年11月28日29日开课目录鲸学名师考点精讲系统提高高二共3阶段精品课夯实基础冲刺技术选考97-100分&#xff01;11月28日【高二|提高|直播】高二精品直播课讲授&#xff1a;浙江选考技术科目第19讲 高二综合提高鲸学名师讲授高中通用技术&#xff1a;第19讲 电控…

十分钟完成Bash 脚本进阶!列举Bash经典用法及其案例

前言&#xff1a;在linux中&#xff0c;Bash脚本是很基础的知识&#xff0c;大家可能一听脚本感觉很高大上&#xff0c;像小编当初刚开始学一样&#xff0c;感觉会写脚本的都是大神。虽然复杂的脚本是很烧脑&#xff0c;但是&#xff0c;当我们熟练的掌握了其中的用法与技巧&am…

【经典回放】多种语言系列数据结构算法:基数排序

目录 一、算法思路 二、C#语言实现 三、C语言实现 一、算法思路 1. 思想基础 基数排序的思想就是先找出待排序中的最大者&#xff0c;然后按最大者申请一个足够大的内存空间&#xff0c;并将其初始化为零&#xff0c;然后将所有待排序的数装入其中&#xff0c;标记装入的数…

探索链路追踪在.NET6工业物联网项目中的应用

如果觉得有用&#xff0c;请留言学到了。已经会了的老哥&#xff0c;请留言就这&#xff1f;可能遇到的问题工业物联网系统自上而下一般分为ERP、Mes、SCADA、WCS、边缘网关、设备等一个生产订单从SAP发送到设备要经过上述多个系统&#xff0c;当某个环节出现问题&#xff0c;可…

《零基础看得懂的C语言入门教程 》——(三)轻轻松松理解第一个C语言程序

一、学习目标 了解C语言代码的一般结构了解函数的概念了解printf函数的使用方法了解头文件的概念了解system函数的使用方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误…

hdu_1728_逃离迷宫(bfs)

题目连接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1728 题意&#xff1a;走迷宫&#xff0c;找最小的拐角 题解&#xff1a;对BFS有了新的理解&#xff0c;DFS剪枝应该也能过&#xff0c;用BFS就要以拐角作为增量来搜&#xff0c;即以当前点为坐标&#xff0c;4…

把文件放在SD卡

2019独角兽企业重金招聘Python工程师标准>>> 在程序中访问SDCard&#xff0c;你需要申请访问SDCard的权限。 在AndroidManifest.xml中加入访问SDCard的权限如下: <!-- 在SDCard中创建与删除文件权限--> <uses-permissionandroid:name"android.permiss…

如何用 windbg 导出 C# 中的 string 内容?

咨询区 driis我在用 windbg 调试一个生产上的 程序卡死 故障 &#xff0c;在线程栈上有一个 string 类型的参数相当大&#xff0c;我用 !dumpobj 命令不能正常显示内容&#xff0c;参考如下&#xff1a;0:036> !do 00000001b30d8668 Name: System.String MethodTable: 00000…

《零基础看得懂的C语言入门教程 》——(四)C语言的基本数据类型及变量

一、学习目标 了解C语言的基本数据类型了解变量的基本概念了解变量的使用方法了解了变量的命名方法了解格式占位符了解变量的输出 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离…

转HTML+CSS总结/深入理解CSS盒子模型

原文地址&#xff1a;http://www.chinaz.com/design/2010/1229/151993.shtml 前言&#xff1a;前阵子在做一个项目时&#xff0c;在页面布局方面遇到了一点小问题&#xff0c;于是上stackoverflow上求助。ifaou在帮助我解决我问题的同时&#xff0c;还推荐我阅读一篇有关CSS盒子…

主成分分析步骤_多元分析(1)--主成分分析

主成分分析主成分分析&#xff08;PCA&#xff09;是数据降维的一种常见方法&#xff0c;其它常见的方法还有因子分析&#xff08;FA&#xff09;,独立成分分析&#xff0c;在进行大数据处理时&#xff0c;因为数据有很多特征&#xff0c;维数过高&#xff0c;不容易进行处理且…

ArcGIS实验教程——实验十九:网络分析(最短路径实现)

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 一、实验描述 网络分析模块用于实现基于网络数据集的网络分析功能,包括路径分析、服务区分析、最近设施点分析、OD成本矩阵分析、多路径配送分析、位置分配分析和高级网络的管理与创建等。 网络…

设计模式之策略模式和状态模式

1 策略模式 我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法&#xff0c; 我们可以简单理解为更加不同的策略对象&#xff0c;执行不同策略方法。 2 类图 3 代码实现 1&#xff09;接口&#xff1a;Strat…