Java9以后的垃圾回收
1: finalize() 方法
- finallize() 方法是Object类的方法, 用于在类被GC回收时 做一些处理操作, 但是JVM并不能保证finalize(0 ) 方法一定被执行,
- 由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的。我们并不能依赖finalize()方法能及时的回收占用的资源,可能出现的情况是在我们耗尽资源之前,gc却仍未触发,因而通常的做法是提供显示的close()方法供客户端手动调用
- 所以一般不建议使用finalize 方法, JDK9 开始已久被废除
- 总结缺点
1: finalize机制本身就是存在问题的。
2:finalize机制可能会导致性能问题,死锁和线程挂起。
3:finalize中的错误可能导致内存泄漏;如果不在需要时,也没有办法取消垃圾回收;并且没有指定不同执行finalize对象的执行顺序。此外,没有办法保证finlize的执行时间。
遇到这些情况,对象调用finalize方法只有被无限期延后
- 观察finalize方法延长类生命周期
class User{
public static User user = null;
@Override
protected void finalize() throws Throwable {
System.out.println("User-->finalize()");
user = this;
}
}
public class FinalizerTest {
public static void main(String[] args) throws InterruptedException {
User user = new User();
user = null;
System.gc();
Thread.sleep(1000);
user = User.user;
System.out.println(user != null);//true
user = null;
System.gc();
Thread.sleep(1000);
System.out.println(user != null);//false
}
}
- JDk9 以前的垃圾回收代码
public class Finalizer {
@Override
protected void finalize() throws Throwable {
System.out.println("Finalizer-->finalize()");
}
public static void main(String[] args) {
Finalizer f = new Finalizer();
f = null;
System.gc();//手动请求gc
}
}
//输出 Finalizer-->finalize()
2:Cleaner类的使用
简介:
在Java9 以后 提供了最终类Clear来代替实现,下面看一下官方例子
package Thread;
import java.lang.ref.Cleaner;
public class CleaningExample implements AutoCloseable{
private final static Cleaner CLEANER=Cleaner.create();// 创建者模式创建对象
static class State implements Runnable{ // 清理对象 下面说
State() {
System.out.println("init");
}
@Override
public void run() {
System.out.println("close");
}
}
private final State state;
private final Cleaner.Cleanable cleanable; // clearner 中的接口 实现唯一的清理方法
public CleaningExample() {
super();
this.state = new State();
this.cleanable=CLEANER.register(this, state); // 注册清理容器中 并且需要清理对象的引用
}
@Override
public void close() throws Exception {
cleanable.clean(); //进行清理操作
}
public static void main(String[] args) {
while(true) {
new CleaningExample();
}
}
}
上面 看出:
- Cleaner 是最终类 不能被重写, 内部方法基本以静态方法提供 掌握例子上面的方法即可
重点指出
static class State implements Runnable
- 如果直接在类中直接定义实现, 必须提供一个静态内部类 (强制),否者不能进行回收 原因(: 普通内部类 局部内部类 对于外部类有依赖(引用),无法真正实现内存的释放 )
- 可以选择直接定义外部类 (较为复杂,需要传递清理引用 Cleanable)
什么时候被回收?
* 1. 注册的Object处于幻象引用状态
- * 2. 显式调用 clean 方法
实际例子(模版)
public class CleaningExample extends Thread implements AutoCloseable {
private final static Cleaner CLEANER = Cleaner.create();
private final State state;
private final Cleaner.Cleanable cleanable;
public CleaningExample() {
this.state = new State();
this.cleanable = CLEANER.register(this, state);
}
@Override
public void close() throws Exception {
cleanable.clean();
}
@SuppressWarnings("resource")
public static void main(String[] args) {
while (true) {
CleaningExample example = new CleaningExample();
}
}
// 模拟业务请求
@Override
public void run() {
System.out.println("数据库 海量 查询请求 ................");
}
// 清理模版
class State implements Runnable {
State() {
System.out.println("<--- init --->");
}
@Override
public void run() {
System.out.println("<--- close --->");
}
}
}
实现基础
/**
* Heads of a CleanableList for each reference type.
*/
final PhantomCleanable<?> phantomCleanableList; final WeakCleanable<?> weakCleanableList; final SoftCleanable<?> softCleanableList; // The ReferenceQueue of pending cleaning actions
final ReferenceQueue<Object> queue;
在CleanerImpl 类进行clearner类的最终实现,看以看到定义的这些个字段,基本上明确了 他的基本原理
Java9以后的垃圾回收的更多相关文章
- 降低Java垃圾回收开销的5条建议
保持GC低开销的窍门有哪些? 随着一再拖延而即将发布的 Java9,G1(“Garbage First”)垃圾回收器将被成为 HotSpot 虚拟机默认的垃圾回收器.从 serial 垃圾回收器到CM ...
- 深入了解java虚拟机(JVM) 第六章 垃圾回收算法
一.标记清除算法 标记清除算法顾名思义,就是将需要回收的对象进行标记,然后进行清除.那么这个算法就有标记和清除两种过程.标记过程主要是通过可达性分析算法进行判断存活对象,然后遍历所有的对象来找到需要回 ...
- Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收
执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...
- 修改session垃圾回收几率
<?php //修改session垃圾回收几率 ini_set('session.gc_probability','1'); ini_set('session.gc_divisor','2'); ...
- .NET面试题系列[5] - 垃圾回收:概念与策略
面试出现频率:经常出现,但通常不会问的十分深入.通常来说,看完我这篇文章就足够应付面试了.面试时主要考察垃圾回收的基本概念,标记-压缩算法,以及对于微软的垃圾回收模板的理解.知道什么时候需要继承IDi ...
- .net垃圾回收机制编程调试试验
1. 什么是CLR GC? 它是一个基于引用跟踪和代的垃圾回收器. 从本质上,它为系统中所有活跃对象都实现了一种引用跟踪模式,如果一个对象没有任何引用指向它,那么这个对象就被认为是垃圾对象,并且可以被 ...
- Java垃圾回收
垃圾收集算法 引用计数 堆中的每个对象都有一个引用计数,当对象被引用时引用计数加1,当对象的引用被重新赋值或超出有效区域时引用计数减1,当一个对象被回收后,它所引用的对象的引用计算减1.当一个对象的引 ...
- JavaScript具有自动垃圾回收机制
JavaScript具有自动垃圾回收机制 原理: 找出那些不再继续使用的变量,然后释放其占用的内存. 正常的生命周期: 局部变量指在函数执行的过程中存在.而在这个过程中,会为局部变量在栈或 ...
- .NET 垃圾回收与内存泄漏
> 前言相信大家一定听过,看过甚至遇到过内存泄漏.在 .NET 平台也一定知道有垃圾回收器,它可以让开发人员不必担心内存的释放问题,因为它会自定管理内存.但是在 .NET 平台下进行编程,绝对不 ...
随机推荐
- MySQL EXPLAIN结果集分析 - 附带大量案例
大量实例助你看懂Explain的输出内容,轻松搞定慢查询 EXPLAIN:查看SQL语句的执行计划 EXPLAIN命令可以帮助我们深入了解MySQL基于开销的优化器,还可以获得很多可能被优化器考虑到的 ...
- 第10讲-Java集合框架
第10讲 Java集合框架 1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1 List 1.2.2 Set 1.2.3 Map 2.具体内容 2.1.Java集合框架 2.1.1 为什么需要 ...
- CSS3 04. 伸缩布局、设置主轴,侧轴方向、主/侧轴对齐方式、 伸缩比例、元素换行、换行控制、覆盖父元素的align-items;控制子元素顺序、web字体、突变字体
CSS3 在布局方面做了非常大的改进,对块级元素的布局排列变得十分灵活,适应性非常强,其强大的伸缩性,在响应式开发中可以发挥极大的作用.(兼容性不好) 必要元素: 指定一个盒子为伸缩盒子 displa ...
- Java网络编程 -- Netty入门
Netty简介 Netty是一个高性能,高可扩展性的异步事件驱动的网络应用程序框架,它极大的简化了TCP和UDP客户端和服务器端网络开发.它是一个NIO框架,对Java NIO进行了良好的封装.作为一 ...
- CentSO7.6下部署Maridb Galera Cluster 实践记录(一)
根据目前系统业务发展,预计未来上集成的概率异常之高,所以提前学习如何部署,网上尽管有很多这方面资料,但是真正适合自己的只有实践过的. 很奇怪目前的yum资源库里面为什么没有galera资源,目前只能通 ...
- mysql 查询参数尾部有空格时被忽略
最近再使用mysql时,无意见发现,当我查询参数尾部输入若干个空格时,依然可以查出和不加空格相同的结果,像这样 select * from wa where name='be ' 等同于 select ...
- 做一个完整的Hadoop项目
1. 完整的数据流图 由同ip访问的次数: SQL查询 select ip,count(ip) from tablename Group by ip; 基于Hadoop分析 使用Hadoop分析,需 ...
- 玩转 SpringBoot 2 快速整合 | JSP 篇
前言 JavaServer Pages(JSP)技术使Web开发人员和设计人员能够快速开发和轻松维护利用现有业务系统的信息丰富的动态Web页面. 作为Java技术系列的一部分,JSP技术可以快速开发独 ...
- FreeSql (四)实体特性 Fluent Api
FreeSql 提供使用 Fluent Api, 在外部配置实体的数据库特性,Fluent Api 的方法命名与特性名保持一致,如下: fsql.CodeFirst .ConfigEntity< ...
- Android的消息循环与Handler机制理解
一.概念 1.事件驱动型 什么是事件驱动?就是有事了才去处理,没事就躺着不动.假如把用户点击按钮,滑动页面等这些都看作事件,事件产生后程序就执行相应的处理方法,就是属于事件驱动型. 2.消息循环 把需 ...