假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击http://106.12.206.16:8080/qingruihappy/index.html

stop the world

在介绍垃圾回收算法之前,我们需要先了解一个词"stop the world",stop the world会在执行某一个垃圾回收算法的时候产生, JVM为了执行垃圾回收,会暂时java应用程序的执行,等垃圾回收完成后,再继续运行。如果你使用JMeter测试过java程序,你可能会发现在测试过程中,java程序有不规则的停顿现象,其实这就是"stop the world",停顿的时候JVM是在做垃圾回收。所以尽可能减少stop the world的时间,就是我们优化JVM的主要目标。接下来我们看一下目前有哪些常见垃圾回收的算法。

引用计数法

引用计数法顾名思义,就是对一个对象被引用的次数进行计数,当增加一个引用计数就加1,减少一个引用计数就减1。

image

上图表示3个Teacher的引用指向堆中的Teacher对象,那么Teacher对象的引用计数就是3,以此类推Student对象的引用计数就是2。

image

上图表示Teacher对象的引用减少为2,Student对象的引用减少为0(减少的原因是该引用指向了null,例如teacher3=null),按照引用计数算法,Student对象的内存空间将被回收掉。

引用计数算法原理非常简单,是最原始的回收算法,但是java中没有使用这种算法,原因有2。1是频繁的计数影响性能,2是它无法处理循环引用的问题。

例如Teacher对象中引用了Student对象,Student对象中又引用了

Teacher对象,这种情况下,对象将永远无法被回收。

其实最主要的原因是就是2的原因,我们来看一下2的具体案例

如上图所看到的的,大的区域是堆内存,小的空间是栈的局部变量表区域。

堆中两个对象相互引用,栈中的对象分别对应着,这个时候假如我们把引用断掉,这个时候垃圾回收机制是回收不了的,因为堆中的两块区域还相互引用着呢。

下面我们来看一下,java的spothot虚拟你采用的是不是这种机制。我们来看下面的代码

public class TestGC {

public Object instance;

private final static int _1M = 1024 * 1024; private byte[] bytesize = new byte[2*_1M]; public static void testGC() { TestGC A = new TestGC();

TestGC B = new TestGC();

A.instance = B;

B.instance = A;

  1. = null;
  2. = null;

System.gc();

} }

public class Test {

public static void main(String[] args) {

TestGC.testGC();

}

}

控制台打印:

[GC (System.gc()) [PSYoungGen: 5407K->552K(18944K)] 5407K->552K(62976K),

0.0434520 secs] [Times: user=0.00 sys=0.00, real=0.04 secs]

[Full GC (System.gc()) [PSYoungGen: 552K->0K(18944K)] [ParOldGen: 0K>517K(44032K)] 552K->517K(62976K), [Metaspace: 2661K->2661K(1056768K)],

0.0229769 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] Heap

PSYoungGen total 18944K, used 164K [0x00000000eb300000,

0x00000000ec800000, 0x0000000100000000) eden space 16384K, 1% used

[0x00000000eb300000,0x00000000eb3290d0,0x00000000ec300000) from space 2560K, 0% used

[0x00000000ec300000,0x00000000ec300000,0x00000000ec580000) to space 2560K, 0% used

[0x00000000ec580000,0x00000000ec580000,0x00000000ec800000)

ParOldGen total 44032K, used 517K [0x00000000c1800000, 0x00000000c4300000,

0x00000000eb300000) object space 44032K, 1% used

[0x00000000c1800000,0x00000000c1881670,0x00000000c4300000)

Metaspace used 2668K, capacity 4486K, committed 4864K, reserved 1056768K class space used 282K, capacity 386K, committed 512K, reserved 1048576K 分析:

主要看:

[GC (System.gc()) [PSYoungGen: 5407K->552K(18944K)] 5407K->552K(62976K)

堆在gc回收前大小为5407k,gc后为552k;

说明两个对象并没有因为相互持有,造成循环引用,无法释放。间接证明JVM 并未采用 reference counting算法管理内存。延伸

控制台打印GC日志

1.右键项目或文件——Debug As——Debug Configurations

2.双击Java Application——VM arguments中填写-verbose:gc——Debug。

VM arguments参数配置:

-verbose:gc (开启打印垃圾回收日志)

-Xloggc:D:testgc.log (设置垃圾回收日志打印的文件,文件名称可以自定义)

-XX:+PrintGCTimeStamps (打印垃圾回收时间信息时的时间格式)

-XX:+PrintGCDetails (打印垃圾回收详情)

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击http://106.12.206.16:8080/qingruihappy/index.html

Jvm(20),如何定义为垃圾对象----引用计数法相关推荐

  1. 垃圾回收-- 引用计数法

    引用计数法 引用计数法,最重要的就是计数器,记录有多少引用该对象 引用计数法与mutator 的执行密切相关,在mutator 的处理过程中通过增减计数器的值来进行内存管理, 在分配和更新对象时会发生 ...

  2. JVM中引用计数法与可达性分析

    目录 概要 如何判断对象已死? 引用计数算法 优点 缺点 举例说明 可达性分析 图例说明 GC Roots的对象包括以下几种 可达性分析回收过程 四大引用 回收方法区 方法区的垃圾收集主要回收两部分内 ...

  3. 【垃圾回收器】基于Go实现引用计数法(ReferenceCount)

    不想传火的,可以点击下面的链接! github:GCByGO 给我点赞嘛,球球了! What This? 现象 引用计数法是一种垃圾回收算法,用于跟踪对象被引用的次数.在该算法中,每个对象都会维护一个 ...

  4. 引用计数法的原理和优缺点

    垃圾标记阶段:对象存活判断 堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中那些是存活对象,哪些是已经死亡的对象.只有被标记为已经死亡的对象,GC才会在垃圾回收过程时 ...

  5. GC算法-引用计数法

    概述 引用计数法又是什么鬼呢? 顾名思义, 对对象的引用进行计数. 通过记录每个对象被引用的次数, 来确定这个对象是否可以被回收. 实现 首先, 对对象的引用数量进行管理, 什么时候会更新呢? 创建对 ...

  6. python引用计数实例_Python中的引用计数法

    [toc] 引用计数法 增量操作 如果对象的引用数量增加,就在该对象的计数器上进行增量操作.在实际中它是由宏Py_INCREF() 执行的. #define Py_INCREF(op) (((PyOb ...

  7. python的super super easy教程 | 垃圾回收 引用计数 深拷贝和浅拷贝

    input最好是放在函数外面range(i)表示从0到(i-1)函数的作用:接收一个参数 返回一个参数python的内存管理 (常见的面试题)python的内存机制:以引用计数为主,分代回收,标记清除 ...

  8. Python学习:引用计数法

    1.增量操作 如果对象的引用数量增加,就在该对象的计数器上进行增量操作.在实际中它是由宏Py_INCREF() 执行的. #define Py_INCREF(op) (((PyObject*)(op) ...

  9. 【JVM基础】垃圾回收算法详解(引用计数、标记、清除、压缩、复制)

    前言 笔记参考 Java 全栈知识体系.星羽恒.星空茶 文章目录 前言 垃圾回收概述 引用计数法 案例 优点 缺点 标记.清除.压缩 标记 清除 压缩 标记清除算法 优点 缺点 标记压缩算法 优点 缺 ...

最新文章

  1. 人工智能及其应用(第5版).蔡自兴-1-5章课后习题。【部分无答案】
  2. linux如何运行windows游戏,可运行在Linux下最好Windows软件和游戏
  3. 存储控制器wwn号_正文-新华三集团-H3C
  4. AngularJs 键盘事件和鼠标事件
  5. NGUI从入门到实战第1章开启NGUI学习之旅
  6. 使用powershell批量导入AD用户
  7. tomcat(9)Session管理
  8. linux渗透测试_渗透测试:选择正确的(Linux)工具栈来修复损坏的IT安全性
  9. linux内存分配器类型,内核早期内存分配器:memblock
  10. jq获取表格里的checkbox_Python抓取网页表格(一)
  11. mysql+join的原理,Mysql连接join查询原理知识点
  12. 《信号与系统学习笔记》—信号与系统的时域和频域特性(二)
  13. SpringBoot:使用Caffeine实现缓存
  14. 收藏级!运营人必备2021全年热点营销日历
  15. Flink catalog简单使用
  16. 雷电模拟器使用adb命令(采坑)
  17. 2018最受欢迎测试工具
  18. 梁漱溟:人生的三种态度 | 合道的生活
  19. 在线阅读.epub文件的网站
  20. 影视账号涨粉10w,反套路营销获赞百万,小红内容趋势是什么?

热门文章

  1. PLSQL Developer简单使用及常用快捷键
  2. Redhat Linux配置远程桌面
  3. TensorFlow可以“预装”数据集了,新功能Datasets出炉
  4. 谷歌医疗AI商业化提速!Jeff Dean亲自挖来大总管
  5. AI进军B-Box界:输入20秒任意声音,还你一段定制的B-Box演奏
  6. lvs + keepalived + nginx 实现高可用
  7. 如果$.ajax函数迟迟得不到响应,那么最有可能出错的地方是请求参数写错了
  8. JavaScript 对象总结
  9. 北上广深的请注意,阿里聚安全来找你玩啦~
  10. Redis基础笔记 (二)