如何创建一个不被回收的对象
来源:互联网 发布:pcb软件哪个好 编辑:程序博客网 时间:2024/06/05 14:42
如何创建一个不被回收的对象?
有同学问我。
最近在看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
接口啊。
- 如何创建一个不被回收的对象
- 浅析spring中创建的对象如何保证不被回收
- 垃圾回收的依据,如何判断一个对象已经毫无用处
- 如何创建一个对象
- GC是如何判断一个对象为"垃圾"的?被GC判断为"垃圾"的对象一定会被回收吗?
- GC是如何判断一个对象为"垃圾"的?被GC判断为"垃圾"的对象一定会被回收吗?
- 对象的创建、回收、new和malloc
- JavaScript如何创建一个对象
- 如何创建一个不使用xib的helloworld;
- 一个类如何只创建一个对象?
- 4、如何强制垃圾回收一个对象?(java)
- JVM如何判断一个Java对象是否可以回收
- JVM如何判断一个Java对象是否可以回收
- 【PB】如何创建一个动态的数据窗口对象?
- 如何创建一个动态的数据窗口对象
- 如何创建一个动态的数据窗口对象
- OC-003.如何去创建一个NSString的对象
- 【PB】如何创建一个动态的数据窗口对象?
- maven下载部署以及环境变量配置
- TCP、UDP、HTTP、SOCKET之间的区别
- 去广告引用优酷视频
- java合成多张图片
- MySQL 开启与关闭远程访问
- 如何创建一个不被回收的对象
- MFC Combobox 输入内容自动补全并选中缺失部分(类似qq登录输入账号)
- 设计模式----简单工厂
- 让网站提速的最佳前端实践
- shell下数字和字符串比较操作命令 if的参数说明
- vue笔记---打包文件
- Android studio JNI 制作SO文件,在其他项目中调用
- WPF 中鼠标事件无效
- Linux下ps -ef和ps aux的区别及格式详解