如网站站长如何对付黑客,福州seo外包公司,如何购物网站建设,wordpress 原创开源推荐推荐一款一站式性能监控工具#xff08;开源项目#xff09;Pepper-Metrics是跟一位同事一起开发的开源组件#xff0c;主要功能是通过比较轻量的方式与常用开源组件#xff08;jedis/mybatis/motan/dubbo/servlet#xff09;集成#xff0c;收集并计算metrics开源项目Pepper-Metrics是跟一位同事一起开发的开源组件主要功能是通过比较轻量的方式与常用开源组件jedis/mybatis/motan/dubbo/servlet集成收集并计算metrics并支持输出到日志及转换成多种时序数据库兼容数据格式配套的grafana dashboard友好的进行展示。项目当中原理文档齐全且全部基于SPI设计的可扩展式架构方便的开发新插件。另有一个基于docker-compose的独立demo项目可以快速启动一套demo示例查看效果https://github.com/zrbcool/pepper-metrics-demo。如果大家觉得有用的话麻烦给个star也欢迎大家参与开发谢谢进入正题...GC的出现解放了程序员需要手动回收内存的苦恼但我们也是要了解GC的知己知彼百战不殆嘛。常见的GC回收算法主要包括引用计数算法、可达性分析法、标记清除算法、复制算法、标记压缩算法、分代算法以及分区算法。其中引用计数法和可达性分析法用于判定一个对象是否可以回收其他的算法为具体执行GC时的算法。今天来聊聊可达性分析法并说明一下什么样的对象才是真正可以被回收的。在介绍引用计数法的时候我们提到了此种算法的循环引用的缺陷所以Java没有使用此种算法。那Java使用的是啥算法来标记一个对象是否是垃圾对象呢Java是通过判断一个对象是否可触及以及一个对象的引用类型强引用、软引用、弱引用、虚引用来决定是否回收这个对象。本文将根据上述分为两部分进行介绍。最后会简单介绍一下GC回收过程中保证数据一致性的方法Stop the World1 如何判断一个对象是否可触及判断是否可触及包含两个要素 通过可达性分析该对象到GC Root不可达如果不可达会进行第一次标记。 已经丧失自救机会如果没有自救机会会进行第二次标记此时该对象可回收。1.1 可达性分析可达性分析法定义了一系列称为GC Roots的对象作为起始点从这个起点开始向下搜索每一条可达路径称为引用链当一个对象没有任意一条引用链可以到达GC Roots时那么就对这个对象进行第一次可回收标记。那么什么是GC Root呢可以理解为由堆外指向堆内的引用。那么都有哪些对象可以作为GC Roots呢 包括如下几种 代码中某一方法中的局部变量 类变量静态变量 常量 本地方法栈中引用的对象 * 已启动且未停止的线程下面以一段代码来简单说明一下前三类class 这段代码的运行时内存图示如下首先类加载器加载Test类会初始化静态变量a将常量引用指向常量池中的字符串完成Test类的加载然后main方法执行main方法会入虚拟机方法栈执行main方法会在堆中创建A的对象并赋值给局部变量innerA。此时GC Roots状态如下当main方法执行完出栈后变为第三个对象已经没有引用链可达GC Root此时第三个对象被第一次标记。1.2 对象的自救一个被可达性分析标记为可回收的对象是有机会进行自救的。前提是覆写了Object的finalize()方法且GC还没有执行该对象的finalize()方法。先来看一下finalize方法的定义/**
大致翻译一下前两段当GC判定某一对象不再通过任一形式被引用时GC会调用该对象的finalize方法。方法执行时可以进行任何操作包括将这个对象再次赋值给某一变量引用但其主要目的还是做一些对象的清除操作。其实在finalize方法中只要将这个对象的引用(this)再次赋值给某一变量这个对象就可以自救。如果一个对象在finalize阶段也没有完成自救那么就真的要被回收了。下面演示一个自救的例子public 上述代码很简明可根据注释理解。代码执行结果如下2 不同引用类型的回收Java中有四种引用类型引用强度由强到弱强引用、软引用、弱引用、虚引用。针对不同的引用类型GC的回收策略不同。2.1 强引用通过关键字new的对象就是强引用对象强引用指向的对象任何时候都不会被回收宁愿OOM也不会回收。2.2 软引用如果一个对象持有软引用那么当JVM堆空间不足时会被回收。一个类的软引用可以通过java.lang.ref.SoftReference持有。2.3 弱引用如果一个对象持有弱引用那么在GC时只要发现弱引用对象就会被回收。一个类的弱引用可以通过java.lang.ref.WeakReference持有。2.4 虚引用几乎和没有一样随时可以被回收。通过PhantomReference持有。3 Stop the World问题的出现如果程序一边执行一边进行可达性分析的标记操作那么有可能刚标记完一个对象这个对象又再次被赋值给其他的引用。这样就有可能回收掉正在使用的对象。解决这个问题的方式就是Stop the WorldSTWSTW会在所有线程到达一个安全点时暂停掉所有应用线程的执行然后开始专心的标记垃圾对象。这样就保证了数据的一致性不会导致误回收。