Java GC是Java的垃圾回收机制

  • Java堆是被所有线程共享的一块内存区域,所有对象实例和数组都在堆上进行内存分配。为了高效的进行垃圾回收,虚拟机把堆内存分为新生代,老年代和永久代3个区域
  • 新生代可以分为Eden区和Survivor Space(S0,S1)区,大多数情况下,对象在Eden区分配,当Eden没有足够的内存空间时触发一次Minor GC
  • Survivor是幸存区,是新生代和老年代的缓冲区域,当新生代发生MinorGC时,会将存活的对象从Eden区移动到S0内存区域,并清空Eden区,当再次发生Minor GC时,将Eden和S0中存活的对象移到S1区;存活对象反复在S0和S1移动,当对象在Surivivor之间移动或者从Eden移动到Surivivor区时,对象的GC年龄会不断增加,当GC年龄超过默认阈值15会进入老年代
  • 老年代用于存放经过几次MinorGC后依然存活的对象,当老年代空间不足时会触发Full GC/Major GC,速度比MinorGC慢十多倍

如何判断对象是否存活

  • 引用计数法

对象上添加一个引用计数器,每当有一个对象引用它时,计数器加1,当使用完该计数器时,计数器减1,计数器为0表示该对象不被使用

优点:实现简单,判定高效

缺点:无法解决对象之间相互引用的问题

  • 可达分析法

通过一系列的GC Roots对象作为起点,从这些起点开始向下搜索,搜索路径称为引用链

可作为GC Roots的对象:

  1. 本地变量表中引用的对象 / 虚拟机栈中引用的对象
  2. 方法区中静态变量引用的对象
  3. 方法区中常量引用的对象
  4. Native方法引用的对象

当一个对象到GCRoots没有任何引用链时,就表示该对象可以被回收

使用可达性分析法判断一个对象是否可被回收需要经过两次标记:

  1. 对象ObjectA到GC Roots没有引用链,进行第一次标记
  2. 如果ObjectA重写了finalize方法,且还未执行过,那么ObjectA会被插入到一个F-Queue队列中,再由一个虚拟机自动创建的,低优先级的Finalizer线程触发其finalize方法。finalize方法中如果对象ObjectA与引用链中的对象建立联系,那么在进行第二次标记时ObjectA会被移出即将回收的集合(注:finalize方法只会被JVM调用一次)

GC算法:

  • 标记清除(老年代)

对待回收的对象进行标记

缺点:标记和清除过程效率都很低,收集之后会留下很多内存碎片,不利于大对象的分配

  • 复制(年轻代)

将内存分为大小相等的A和B两份,每次只使用一份,A中内存用完了,就把A中存活的对象复制到B中,并清空A的内存

优点:只需要标记存活的对象,标记效率得到提高;避免了内存碎片的问题

缺点:可用内存缩小为原来的一半

  • 标记整理(老年代)

老年代中,对象的存活率较高,复制算法效率比较低,在标记整理算法中,标记出所有存活的对象并移到一端,然后直接清理边界以外的内存

Java的GC是什么?做了什么?的更多相关文章

  1. JVM学习(4)——全面总结Java的GC算法和回收机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  2. JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  3. Java的GC

    垃圾收集 在探究Jvm的过程中,有两个点特别需要关注,一是:内存的使用,分配策略,而这一点是在前一篇博客已经介绍过了. 二是:内存的回收.也就是这一篇博客所要探究的关键点. 内存回收需要关注的几个点: ...

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

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

  5. Java的GC机制及算法

    GC的阶段  对每个对象而言,垃圾回收分为两个阶段:finalization和reclamation.  finalization: 指运行这个对象的finalize的方法. reclamation: ...

  6. 为什么Java有GC调优而没听说过有CLR的GC调优?

    前言 在很多的场合我都遇到过一些群友提这样的一些问题: 为什么Java有GC调优而CLR没有听说过有GC调优呢? 到底是Java的JVM GC比较强还是C#使用的.NET CLR的GC比较强呢? 其实 ...

  7. Java -verbose:gc 命令

    Java -verbose:gc 中参数-verbose:gc 表示输出虚拟机中GC的详细情况. [Full GC 168K->97K(1984K), 0.0253873 secs]   解读如 ...

  8. JAVA 从GC日志分析堆内存 第七节

    JAVA 从GC日志分析堆内存 第七节   在上一章中,我们只设置了整个堆的内存大小.但是我们知道,堆又分为了新生代,年老代.他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比 ...

  9. Java之GC

    Java之GC GC:GC 是JVM的垃圾回收器.与C/C++不同,java程序员无需考虑太多内存分配的位置,更不用考虑内存释放的机制,java对象内存的申请和释放都有JVM托管.JVM的内存释放机制 ...

  10. Java用户输入数值,做简单的猜数字游戏,导入基础的工具包util

    Java用户输入数值,做简单的猜数字游戏,导入基础的工具包util,导入包的方法为,import java.util.*: 完整的实例代码: /* 导入基础工具包 */ import java.uti ...

随机推荐

  1. vue.js实现用户评论、登录、注册、及修改信息功能

    vue.js实现用户评论.登录.注册.及修改信息功能:https://www.jb51.net/article/113799.htm

  2. 基于rem的移动端响应式适配方案(详解) 移动端H5页面的设计稿尺寸大小规范

    基于rem的移动端响应式适配方案(详解) : https://www.jb51.net/article/118067.htm 移动端H5页面的设计稿尺寸大小规范 http://www.tuyiyi.c ...

  3. Spring Cloud注册中心高可用搭建

    Spring Cloud的注册中心可以由Eureka.Consul.Zookeeper.ETCD等来实现,这里推荐使用Spring Cloud Eureka来实现注册中心,它基于Netfilix的Eu ...

  4. python基础之数据类型初始

    变量 贴标签 变量名规则:只能是字母下划线和数字组成,不能以数字开头,不能和关键字同名,不能使用拼音和中文,具有可描述性,区别大小写,变量名推荐写法:驼峰提,下划线(官方推荐) 变量赋值 常量 特性: ...

  5. 【足迹C++primer】47、Moving Objects(2)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/cutter_point/article/details/37954805 Moving Object ...

  6. KiCAD绘制电源符号

    KiCAD绘制电源符号 KiCAD自带的电源符号有时候不符合我们的操作习惯,需要自己重新定义电源符号,这时候就需要新建(不能更改系统自带库的电源符号) 1.新建符号,参照下图行设置 2.放置引脚和图形 ...

  7. redis-布隆过滤器使用

    占用空间测试地址 https://krisives.github.io/bloom-calculator/

  8. scrollHeight与offsetHeight

    offsetXxx 是 HTMLElement 的属性, HTMLElement 接口表示所有的 HTML 元素,scrollXxx 是 Element 的属性,Element 是一个通用性非常强的基 ...

  9. mongoose 常用数据库操作 删除

    删除 Model.remove(conditions, [callback]) try.js var User = require("./user.js"); function d ...

  10. nodejs 进阶:图片裁剪

    demo 图片: 效果: var fs = require('fs'); var gm = require('gm'); gm("./不饿.jpg").crop(100,100,2 ...