文档章节

如何创建一个不被回收的对象

那只是一股逆流
 那只是一股逆流
发布于 2017/03/02 16:51
字数 645
阅读 42
收藏 0

如何创建一个不被回收的对象? 有同学问我。

最近在看JVM的我很快想到了四种引用,并回答他:只需要保持始终有一个强引用引用它就行了。

那么谁来引用这个对象呢?如何保证引用这个对象的对象不被回收呢?

确实,好像我们创建的对象都避免不了被回收的命运,不管引用链再长被回收只是时间长短问题。但是真的没有不被回收的对象吗?答案肯定有,我们细想一下,对,$JAVA_HOME中的类的对象(下文简称home对象)不会被回收除非JVM退出了。

可是,要达到我们的目标好像有点不对啊,我们需要一个不会被回收的对象引用我们,换句话说我们需要home对象引用我们,但是平时好像都是我们引用它们的呀。不对不对,好像搞反了。

要想home对象引用我们的对象,也就意味着home类依赖我们的定义的类,父类加载器依赖子类加载器加载的类,怎么可能有这种事?这样不是破坏了双亲委派模型吗?

真的不存在吗?

不,确实存在这样的事情,父类加载器依赖子类加载器加载的类,我们仔细回想一下,我们创建数据库连接的第一步是什么?

Class.forName("xxx.xxx.Driver")

通过这行代码将各个厂商实现的数据库驱动加载进来并注册在DriverManager中的静态final数组中:registeredDrivers

DriverManager.registerDriver(new Driver());
    
private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();

因为DriverManager.class在rt.jar中,由BootStrapClassLoader负责加载; 如果要回收我们注册Driver对象,意味着要卸载DriverManager类,而卸载一个类要求很严格:

  1. 该Class的所有对象都已经被回收;
  2. 该Class的类加载器已经被回收;
  3. 该类的java.lang.Class对象没有在任何地方被引用。 满足了这三个要求才会被卸载,很显然要卸载DriverManager类,第二个要求肯定满足不了。除非JVM shutdown,如果JVM已经shutdown了,我们也就没有讨论的必要了。

所以说我们可以通过这种方式实现我们的一个对象永远不被回收,虽然这样做好像没有多大的意义。。。

怎么做? 。。。 实现java.sql.Driver接口啊。

© 著作权归作者所有

共有 人打赏支持
下一篇: 浅析ThreadLocal
那只是一股逆流
粉丝 9
博文 22
码字总数 26214
作品 0
南岸
后端工程师
私信 提问
Java程序员的日常—— 垃圾回收中引用类型的作用

在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情。因此了解垃圾回收的相关知识就显得很重要了。 引用,...

青夜之衫
2017/12/05
0
0
Java内存学习(1)

java内存管理:对象的分配与释放 1)分配:由程序完成(new个对象,申请空间),堆操作 2)释放:垃圾回收机制执行,简化工作,加重jvm工作,需GC监控 2. java内存泄露 分配对象两个特点:①...

储明城
2016/03/11
47
2
Android中常见的内存泄漏 memory leak

四种主要的情况: 1、Activity对象未被回收 2、集合对象造成的泄漏 3、资源对象没关闭造成内存泄漏 4、使用对象池避免频繁创建对象 ------------------------------------------------------...

MonkeySun
2016/11/14
50
0
Java编程思想: 初始化与清理

构造器与方法 构造器和类名一致, 是因为: 1.保证不和方法名冲突. 2.编译器知道如何进行调用. 默认构造函数: 1. 没有任何参数. 2.没有任何构造器时会默认生成, 保证类的对象会被初始化. 如果类...

fzyz_sb
2016/07/14
28
0
理解Java中的弱引用(Weak Reference)

What——什么是弱引用? Java中的弱引用具体指的是java.lang.ref.WeakReference<T>类,我们首先来看一下官方文档对它做的说明: 弱引用对象的存在不会阻止它所指向的对象变被垃圾回收器回收。...

绝地逢生
11/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
17
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
11
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部