ReviewForJob——java虚拟机的垃圾回收策略(个人总结)

理解jvm的垃圾回收策略,需要解决以下3个问题
问题1:哪些内存需要回收?
问题2:什么时候进行回收?
问题3:怎样来回收?

【解决问题1】哪些内存需要回收?
jvm的内存区域有5大块:
1)程序计数器:线程私有,用于记录 当前线程所执行class 字节码的行号计数器;
2)java 虚拟机栈:线程私有,指java 方法执行的 内存模型;
3)本地方法栈:线程私有,指java 本地方法执行的 内存模型;
4)java堆:线程公有,用于存储所有对象实例 和 数组;
5)方法区:线程公有,用于存储编译后的 类信息(Class类),常量,静态变量 和 即时编译后的数据;
显然,线程公有的内存区域需要回收,即 java堆 和 方法区;
看个荔枝:以可达性分析算法为荔枝,来介绍哪些内存需要回收?
其基本思想就是通过称为“GC Root”的对象作为起点,点向下搜索,搜索所走过的路径称为引用链,但一个对象到GC Root没有任何引用链相连的话,则证明对象是不可用的;(这时可以考虑通过 相交集和非相交集算法来实现)
GC Roots的对象包括下面几种(Objects):
O1)虚拟机栈或本地方法栈中引用的对象;
O2)方法区中常量或类静态属性引用的对象;

【解决问题2】什么时候进行回收?
显然当 java堆或方法区的内存容量不足以满足class字节码运行时所需要的内存空间的时候,就需要进行内存回收(因为在运行期间,你不知道该字节码文件需要多少内存,多大内存);

【解决问题3】怎样来回收?这就不得不讲 垃圾回收算法了。
写在前面)java堆分为 老年代 和 新生代;对象首先分配在新生代Eden区中,当在新生代中经过若干次垃圾收集后,该对象如果还存在的话,就将其移入老年代进行存储;

算法1)标记-清除算法(回收老年代):首先根据可达性分析标记处需要回收的对象;之后再统一回收所有被标记的对象;
缺点1:效率问题,标记和清除两个效率都不高;
缺点2:空间问题,标记清除之后会留下大量的内存碎片 以至于可能导致以后分配较大对象时,因为无法找到足够的连续内存而不得不提前触发来一次垃圾收集动作;

算法2)复制算法(回收新生代):将jvm公共内存(主要是堆内存)划分为容量相等的两块A 和 B,每次只使用其中一块,如A 来进行运行时的内存分配;当块A要使用完的时候,将块A中的还存活的对象复制到 块B上,然后一次性回收块A中的使用空间。下一次就使用块B 来进行运行时的内存分配了,而块A的使用空间为零,即块A的所有空间可用(复制垃圾回收算法主要解决的问题是: 内存碎片问题
缺点1:该算法的代价是将内存缩小了一半;内存利用率低;


算法3)复制算法变体算法(回收新生代):内存空间并不是像 算法2那样 1:1 的分配,而是将内存分为 一块 8个单位的称为 Eden空间的内存, 两块 1个单位的称为Survivor 空间的内存,记为A和B;每次只使用 Eden空间内存 和 其中一块Survivor空间 如A的内存;当 上述内存空间要使用完的时候,就把 Eden空间和 Survivor A 空间的对象复制到 Survivor B空间中,然后再清除 Eden空间 和 Survivor A 空间中的内存;下次运行时内存分配区域是 Eden空间 和 Survivor A空间;
那如果 上述过程中 Survivor B 无法储存 Eden 和 Survivor A 中的对象的时候,需要其他内存(老年代)进行分配担保,即借用老年代的一部分内存空间来存储 Eden 和 SurvivorA 中的对象数据。

算法4)标记整理算法(回收老年代):该算法类似于 标记清除算法,不同的是在清理阶段,让所有存活对象都向一端移动,然后直接清理内存边界以外的内存

算法5)算法综述——分代收集算法:要知道 java堆内存分为 新生代 和 老年代;
新生代:新生代中,每次垃圾收集时都发现有大批对象时区,只有少量存活,选用复制算法;
老年代:因为老年代中 对象存活率高,没有额外空间对它进行分配担保,就必须使用 “标记-清理” 或 标记整理算法 进行回收;

【2】Minor GC 和 Full/Major GC
1)Minor GC(新生代GC):因为 对象首先分配在 java堆新生代中的 Eden空间,如果Eden空间不够用的话,就会进行一次 Minor GC;
2)Full/Major GC(老年代GC):大对象直接进入老年代(大对象就是需要大量连续内存空间的对象)
注意)Full/Major GC 比 Minor GC的速度至少慢10倍以上;所以能用Minor GC 解决问题 就不要用 Major GC;

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

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

相关文章

使用静态代理模式实现公用的报表导出功能

先聊一下什么是代理模式? 代理模式 给某个对象提供一个代理对象,并由代理独享控制对原对象的引用。什么意思呢?代理模式就有点像我们生活中常见的中介。 举个例子,我想买辆二手车,第一种方式是自己去找车源&#xff…

java前台线程(普通线程) 和 后台线程

【1】普通线程: 就是指 用户 创建的一般线程,具有个体性,不具有提供公共服务的性质,因此, 通常需要我们在 线程的 循环语句中 手动编写 循环结束语句,也即 线程运行终止的条件语句; 【2】后台线…

mysql中使用CASE WHEN

简单的使用CASE WHEN CASE SCORE WHEN A THEN 优 ELSE 不及格 END CASE SCORE WHEN B THEN 良 ELSE 不及格 END CASE SCORE WHEN C THEN 中 ELSE 不及格 END上面的sql等同于 CASE SCORE WHEN A THEN 优 WHEN B THEN 良 WHEN C THEN 中 ELSE 不及格 ENDTHEN后面的值与ELSE后面…

Java生成随机数的几种高级用法

转载自 进阶 | Java生成随机数的几种高级用法!言归正传,众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数。看似简单,但有时我们也会忽略了一些有趣的…

Java 可重入锁内存可见性分析

转载自 深度好文 | Java 可重入锁内存可见性分析一个习以为常的细节之前在做 ReentrantLock 相关的试验,试验本身很简单,和本文相关的简化版如下:(提示:以下代码均可左右滑动) private static ReentrantLoc…

java正则表达式 ^expr 和 [^expr] 和 ^[^expr]的比较

public class Main {private static String[] array {"Jav", "Java", "Hello"}; public static void main(String[] args) {String[] regexs {"^Java", // 以 Java开头的字符串"[^Java]",// 除了 J a v a 之外 的任何字符…

优秀 Java 程序员写代码的风格

转载自 涨姿势 | 优秀 Java 程序员写代码的风格今天突发奇想,对编码习惯和 编程风格 很感兴趣,于是乎,找了一下关于编程风格(Java篇)的资料,希望对爱好编码或者开始学习编码的同学有帮助!来自《…

2017尼毕鲁笔试算法题

【1】题目: 给定一个无序数组,找到最长的单调自增子序列(不一定连续,但是顺序不能乱)的长度; 【2】看个荔枝:给定数组 [10, 9, 2, 5, 3, 7, 101, 18] 输出结果为 [2, 3, 7, 101]。。算法时间…

2018年不能错过的 14 个 Java 库

转载自 2018年不能错过的 14 个 Java 库下面是整理给你的 2018 年不应该错过的 14 个 Java 库包清单,多多少少大家应该都接触过一些,如果还没听过那就OUT了。GuiceGuice是一个Java 6以上支持依赖注入框架。由谷歌提供。OkHttpHTTP是现代网络的通讯方式。…

Spring MVC Boot Cloud 技术教程汇总

转载自 Spring MVC & Boot & Cloud 技术教程汇总昨天我们发布了Java成神之路上的知识汇总,今天继续。 Java成神之路技术整理(长期更新) 以下是Java技术栈微信公众号发布的关于 Spring/ Spring MVC/ Spring Boot/ Spring Cloud 的技术…

group by分组、having() 筛选组的用法

【1】选出 除语文学科外,且学科平均分大于60 的每个学科的最高最低分;

Java成神之路技术整理

转载自 Java成神之路技术整理以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新。 Java 基础篇Java 集合篇Java 多线程篇Java JVM篇Java 进阶篇Java 新特性篇Java 工具篇Java 书籍篇 Java基础篇 8张图带你…

RFC+JSF术语

RFC 请求注解(Request For Comments) JSF JavaServer Faces (JSF) is a Java specification for building component-based user interfaces for web applications.

图解 5 种 Join 连接及实战案例!(inner/ left/ right/ full/ cross)

转载自 图解 5 种 Join 连接及实战案例!(inner/ left/ right/ full/ cross) Join 连接在日常开发用得比较多,但大家都搞清楚了它们的使用区别吗??一文带你上车~~ 内连接 inner join 内连接是基于连接谓词…

接口、多态

一.接口 1.接口的定义和使用 接口名:和类名一样,首字母大写 public interface 接口名{//接口中的成员,一般写一些抽象方法 } public class 类名 implements 接口名{//复写接口中所有的抽象方法 } 2.接口的成员热点: &#xff0…

基础笔试编程题(jz)

【1】计算某个单词在某文件中出现的次数. // 计算某个单词在某文件中出现的次数. public class WordCounter {private static int counter;private static String path System.getProperty("user.dir") File.separator "src" File.separator "com…

到底什么是 OAuth 2.0

转载自 到底什么是 OAuth 2.0 ? 一文秒懂!- 理解OAuth 2.0OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文对OAuth 2.0的设计思路和运行流程,做一个简明…

在eclipse中创建maven项目错误的解决方法:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-qu

当我们在ecipse安装 maven插件后, (how to install maven plugin named m2eclipse) You can install the lastest M2Eclipse release (1.7.0) by using the following update site from within Eclipse: http://download.eclipse.org/technology/m2e/releases 创建…

继承、抽象

继承、抽象 一.继承 1.继承解决的问题:共性抽取 子类中有共性的内容(成员变量、成员方法)抽取到父类中,子类可以直接使用父类非私有的成员。 2.继承的格式 public cLass 父类{//成员变量、构造方法、成员方法 }public class 子…

JDK 5 ~ 10 新特性倾情整理

转载自 JDK 5 ~ 10 新特性倾情整理最近连 JDK11都在准备发布的路上了,大家都整明白了吗?也许现在大部分人还在用6-8,8的新特性都没用熟,9刚出不久,10-11就不用说了。为了大家对JDK有一个全面的了解,下面我为…