什么样的对象需要回收

  如果对象已经死亡了,就可以进行回收,判断方式如下

  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的更多相关文章

  1. 【java虚拟机】垃圾回收机制详解

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分 ...

  2. Java 虚拟机 - GC 垃圾回收机制分析

    Java 垃圾回收(Garbage Collection,GC) Java支持内存动态分配.垃圾自动回收,而 C++ 不支持.我想这可能也是 为什么 Java 脱胎于 C++ 的一个原因吧. GC 的 ...

  3. 深入理解java虚拟机---3垃圾回收机制GC

    本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...

  4. java虚拟机 之 垃圾回收机制

    一.如何判断对象已死 垃圾回收器并不是java独有的,垃圾回收器的作用就是回收对象释放内存空间,那么如何判断哪些对象应该被回收呢? 在Java语言中是采用GC Roots来解决这个问题.如果一个对象和 ...

  5. java虚拟机之垃圾回收机制

    一.需要回收的内存区域     程序计数器.虚拟机栈.本地方法栈 3 个区域随线程生灭(因为是线程私有),栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.而 Java 堆和方法区则不一 ...

  6. Java虚拟机之垃圾回收详解一

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  7. Java虚拟机之垃圾回收

    简述 Java与那些较传统的语言比如C++有个很大不同就是垃圾回收策略了.前者通常是虚拟机自动帮我们做了,而后者就需要我们手动来完成. Java虚拟机帮我们完成了垃圾回收,是不是意味着我们就不用完全去 ...

  8. java中存在垃圾回收机制,但是还会有内存泄漏的问题,原因是

    答案是肯定的,但不能拿这一句回答面试官的问题.分析:JAVA是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”.如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处 ...

  9. 每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

随机推荐

  1. JSON介绍及Android最全面解析方法(Gson、AS自带org.son、Jackson解析)

    前言 今天,我们来介绍一下现今主流的数据交换格式-JSON! 相同作为主流为数据交换格式-XML,假设有兴趣能够阅读我写的XML及其DOM.SAX.PULL解析方法和对照 文件夹 定义 JavaScr ...

  2. 【bzoj1787】&【bzoj1832】[Ahoi2008]Meet 紧急集合 & 聚会

    bzoj1787就是bzoj1832 bzoj1832 空间和时间少了一些... 求三个结点到一个结点距离之和最小的结点以及距离和 求出两两lca,其中有两个相同,答案则为另一个 感觉就是一大暴力.. ...

  3. Jenkins重启 在Windows GUI上

    To restart Jenkins manually, you can use either of the following commands: (jenkins_url)/safeRestart ...

  4. P1196 [NOI2002]银河英雄传说(并查集)

    P1196 [NOI2002]银河英雄传说(并查集) 本题关键 用两个一维数组表示了一个稀疏的二维数组. 这两个一维数组一个表示祖先(就是最前面那个),一个表示距离祖先的距离. 并且还有一个关键点是, ...

  5. 4.7.4 Constructing LALR Parsing Tables

    4.7.4 Constructing LALR Parsing Tables We now introduce our last parser construction method, the LAL ...

  6. cisco secure ACS服务器搭建

    网上下载Cisco Secure Access Control System 5.2.iso的镜像,总共有两部分 http://pan.baidu.com/disk/home#path=%252FCi ...

  7. bzoj1791

    1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1680  Solved: 369[Submit][S ...

  8. 13.Ext.extend用法以及代码解读

    转自:http://www.blogjava.net/dragonshrimp/archive/2008/03/01/183060.html Ext.extend用法以及代码解读 概述 Ext.ext ...

  9. CSS3 动画 @keyframes

    通过 CSS3,我们能够创建动画,这可以在许多网页中取代动画图片.Flash 以及 JavaScript. 如下动画,常用于手机端,提示用户往下拖动的渐隐渐出效果. Demo 关键CSS代码 1. 给 ...

  10. Linux day01(二)虚拟机快照和克隆的用法介绍

    一:快照 优点:运行虚拟机后不用担心系统会被弄崩溃了,点击快照会立即恢复到初始状态 缺点:回滚会带来数据的丢失,所以要考虑数据恢复的成本和找回数据时进行操作的成本 1. 在导航栏中找虚拟机快照的小图标 ...