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. 转 关于HTTP和HTTPS的区别

    关于HTTP和HTTPS的区别 运维猿 2018-12-01 07:30:00 一 HTTP和HTTPS的基本概念 1.HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答 ...

  2. spring boot MVC

    1 spring boot的用途 第一,spring boot可以用来开发mvc web应用. 第二,spring boot可以用来开发rest api. 第三,spring boot也可以用来开发w ...

  3. 在同一个项目中灵活运用application/json 和application/x-www-form-urlencoded 两种传输格式(配合axios,同时配置loading)

    'use strict' import axios from 'axios' // import qs from 'qs' import { Notification} from 'element-u ...

  4. 8、服务发现&服务消费者Feign

    spring cloud的Netflix中提供了两个组件实现软负载均衡调用,分别是Ribbon和Feign.上一篇和大家一起学习了Ribbon. Ribbon :Spring Cloud Ribbon ...

  5. JNI原理与静态、动态注册

    前言 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层.这一个系列我们来一起深入学习JNI. ...

  6. matlab filtfilt 函数

    紧接上一篇,简单分析matlab中的非常好用的 filtfilt 函数,一款零相移滤波函数. 其matlab中的语法如下: y = filtfilt(data,x);1非常简单,不是一般的简单!然而, ...

  7. Ubuntu 图形桌面死机重启(机器不重启)

    Ubuntu的图形界面容易死机,如果正在跑程序的话又不能重启.这时候可以通过终端来_重启_图形界面. 首先按Alt+Ctrl+F1进入终端界面.查看图形界面的进程: ps -t tty7 查看到名为X ...

  8. 调试Android有什么错误

    项目目录的cmd调试查看有什么错误 gradlew processDebugManifest --stacktrace

  9. C# 16进制转字符串,字符串转16进制

    { //========================================================== //16进制转字符串 public static byte[] HexTo ...

  10. 【Flutter学习】基本组件之图片组件Image

    一,概述 Image(图片组件)是显示图像的组件,一个显示图片的widget,支持图像格式:JPEG,PNG,GIF,动画GIF,WebP,动画WebP,BMP和WBMP. Image组件有多种构造函 ...