java虚拟机(五)--垃圾回收机制GC5
什么样的对象需要回收
如果对象已经死亡了,就可以进行回收,判断方式如下
1).引用计数器:给对象添加一个计数器,有地方引用,就+1,当引用失效,就-1。当计数器为0时,判断对象不能再使用,但是当对象相互引
用的时候无法进行GC
1).可达性算法:从GC Roots开始,到对象之间有引用链相连,就是可达的。HotSpot采用可达性算法,商用虚拟机没有采用引用计数器
哪些对象能作为GC Roots:
1).局部变量表中引用的对象
2).栈帧中常量引用的对象
3).栈帧中静态变量引用的对象
4).JNI引用的对象
垃圾回收算法
1).标记清除:对不具有可达性的对象进行标记,然后进行统一回收,最基本的GC算法
缺点:标记和清除两个阶段效率都不高,会产生大量不连续的内存碎片,在给大对象分配内存的时候,可能无法找到连续的内存,而不得不提
前进行GC
2).复制:把内存分成相同两部分,每次使用一部分,GC的时候把可用对象复制到另一边,然后把使用的一边直接清理掉,不会产生内存碎片,
但是直接浪费了一半内存,代价太巨大了。
商用虚拟机的新生代都是采用复制算法,新生代的对象98%生命周期都很短,每次使用Eden Space和From Survivor,把这两块区域存活的对象
复制到To Survivor,然后清理内存,Eden Space:From Survivor=8:1,这样每次只会浪费10%内存,当To Survivor内存空间不够的时候,使用老年
代
3).标记整理:如果对象存活率比较高的时候,复制算法的效率就会降低,而且需要有额外的空间进行分担担保,老年代就不可能使用对存活
对象进行标记之后,然后把存活的对象都向一端移动,直接清理边界以外的内存,
4).分带收集:当前商用VM采用的GC算法,新生代使用复制算法,老年代使用另外两个
HotSpot的算法实现
可达性分析从GC Roots节点找引用链时,会发生GC停顿,是指分析期间停止其他所有的线程,如果分析过程中对象引用关系还在变化,准确性
无法得到保证。
主流jvm采用准确式GC,HotSpot中通过一组OopMap的数据结构知道哪些地方存放着对象引用,就可以快速、准确完成GC枚举。
新生代和老生代默认的空间占比分别是是1/3、2/3。
复制算法的执行流程如下
1、把Eden + From Survivor存活的对象放入To Survivor区;
2、清空Eden和From Survivor分区;
3、From Survivor和To Survivor分区交换。
4、每次在From Survivor到To Survivor移动时都存活的对象,年龄就+1,当年龄到达15(默认配置是15)时,升级为老生代。大对象也会
直接进入老生代。
老年代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。
方法区回收:(jdk1.8之前永久带实现了方法区,而在jdk1.8废弃永久带,通过本地内存实现)
对方法区回收也可以说是对永久带回收,主要针对两部分:
1、废弃的常量:例如一个字符串"abc"在常量池中,但是没有任何String对象引用它,进行GC的话,就需要被清理出常量池,类、方法、字段
的符号引用也是相同的
2、无用的类:
1).该类的所有实例都已经被GC
2).加载该类的ClassLoader被GC
3).该类对应java.lang.class对象没有被任何地方引用,也就是无法通过反射得到该类的方法。
引用:
就是本身保存的数据是另一块内存的起始地址
分类:
1、强引用:类似于new一个对象对应的引用,只要具有可达性,不会被回收
2、软引用:软引用关联的对象,在内存溢出发生以前,这些对象会被回收。可以通过SoftReference实现软引用
3、弱引用:只能活到下次GC之前,当进行垃圾回收的时候,它肯定死了。可以通过WeakReference实现软引用
4、虚引用:最弱的一种引用关系。为对象设置虚引用唯一目的就是能在对象被GC的时候收到一个系统通知。可以通过PhantPhantomReference实现软引用
java虚拟机(五)--垃圾回收机制GC5的更多相关文章
- 【java虚拟机】垃圾回收机制详解
作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分 ...
- Java 虚拟机 - GC 垃圾回收机制分析
Java 垃圾回收(Garbage Collection,GC) Java支持内存动态分配.垃圾自动回收,而 C++ 不支持.我想这可能也是 为什么 Java 脱胎于 C++ 的一个原因吧. GC 的 ...
- 深入理解java虚拟机---3垃圾回收机制GC
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
- java虚拟机 之 垃圾回收机制
一.如何判断对象已死 垃圾回收器并不是java独有的,垃圾回收器的作用就是回收对象释放内存空间,那么如何判断哪些对象应该被回收呢? 在Java语言中是采用GC Roots来解决这个问题.如果一个对象和 ...
- java虚拟机之垃圾回收机制
一.需要回收的内存区域 程序计数器.虚拟机栈.本地方法栈 3 个区域随线程生灭(因为是线程私有),栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.而 Java 堆和方法区则不一 ...
- Java虚拟机之垃圾回收详解一
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...
- Java虚拟机之垃圾回收
简述 Java与那些较传统的语言比如C++有个很大不同就是垃圾回收策略了.前者通常是虚拟机自动帮我们做了,而后者就需要我们手动来完成. Java虚拟机帮我们完成了垃圾回收,是不是意味着我们就不用完全去 ...
- java中存在垃圾回收机制,但是还会有内存泄漏的问题,原因是
答案是肯定的,但不能拿这一句回答面试官的问题.分析:JAVA是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”.如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处 ...
- 每日一问:讲讲 Java 虚拟机的垃圾回收
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...
随机推荐
- MySQLi 和 PDO 连接 MySQL
PHP 连接 MySQL PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved) PDO (PHP Dat ...
- Spring和SpringMVC的关系
1.Spring和SpringMVC是父子容器关系. 2.Spring整体框架的核心思想是容器,用来管理bean的生命周期,而一个项目中会包含很多容器,并且它们分上下层关系,目前最常用的一个场景是在一 ...
- c# Http下载
1.首先是服务器上发布资源,如果资源时自定义格式,比如 .zidingyi结尾的后缀文件,需要在MIME类型上添加处理方式 需要注意的是.net里面要设置 System.Net.ServicePoin ...
- web container和spring container之间的关系
1 tomcat是一个web container,它提供java web应用的运行环境,因为它实现了好多java ee规范,比如java Servlet.JSP等,也就是说,没有它,java web应 ...
- 使用-Wl直接向ld传递参数
gcc -Wl, key1, value1, key2, value2, key3, value3 包括-Wl在内全部都是以逗号分隔. 上面等价于: ld key1=value1 key2=value ...
- 为什么要在css文件里定义 ul{margin:0;padding:0;}这个选择器?
为什么要在css文件里定义 ul{margin:0;padding:0;}这个选择器? ul标签在FF中默认是有padding值的,而在IE中仅仅有margin默认有值.请看下面不同浏览中对paddi ...
- Codeforces Round #100 A. New Year Table
A. New Year Table time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- sa分析
onCheckedChanged用于监控开启和关闭,其实是Switch,也是Toggle Buttons http://www.google.com/design/spec/components/sw ...
- xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is
method: select Xcode version in Command Line Tools in Location(Click Xcode and then Preferences) Bef ...
- 报表应用系列——图表JFreeChart: 第 4 章 折线图
双击代码全选 1 2 3 4 5 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100 ...