社区
Java SE
帖子详情
能不能从jvm卸载类?
UnAgain
2006-08-01 05:27:49
第一次用到一个类的时候,ClassLoader会把该类加载到jvm,是吧?
那么有没有办法从jvm卸载该类呢?
我是基于这样的考虑才提出这个问题的:
比如我在应用里要用到DOMParser,但仅仅在应用开始的时候使用一次,而该类及其相关类却要一直存在,直到应用结束。这样是不是有点浪费资源?
小程序当然无所谓,但是对于一个大的应用,这个问题恐怕不能不考虑
先给20分,有回答会再增加100
...全文
1047
43
打赏
收藏
能不能从jvm卸载类?
第一次用到一个类的时候,ClassLoader会把该类加载到jvm,是吧? 那么有没有办法从jvm卸载该类呢? 我是基于这样的考虑才提出这个问题的: 比如我在应用里要用到DOMParser,但仅仅在应用开始的时候使用一次,而该类及其相关类却要一直存在,直到应用结束。这样是不是有点浪费资源? 小程序当然无所谓,但是对于一个大的应用,这个问题恐怕不能不考虑 先给20分,有回答会再增加100
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
43 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fishyqd
2006-08-30
打赏
举报
回复
mark,学习一下
jeckzang
2006-08-30
打赏
举报
回复
顺便问一下能不能替换jvm中的同名已加载的类呀?
jeckzang
2006-08-30
打赏
举报
回复
十分关注这个问题
pauliuyou
2006-08-23
打赏
举报
回复
问题不错, 关注中.
wanglian1024
2006-08-22
打赏
举报
回复
垃圾回收是JVM层面的事情,而且与具体的JVM实现相关,程序员是无法确知垃圾回收在何时执行,不管是对象回收还是类回收。
flyforlove
2006-08-22
打赏
举报
回复
UnAgain() ( ) 信誉:98 2006-08-22 10:37:00 得分: 0
我指的是如果程序员自己知道一个类在一次用过之后,可以确保以后不再使用的情况下,sun应该给程序员提供一个选择。
--------------------------------
但是你都不知道类的实例什么时候释放的,你怎么可能知道这个类还有没有在用?
UnAgain
2006-08-22
打赏
举报
回复
我指的是如果程序员自己知道一个类在一次用过之后,可以确保以后不再使用的情况下,sun应该给程序员提供一个选择。
cyeahpro
2006-08-22
打赏
举报
回复
GC是对对象的回收而不是对类的卸载。
jvm里有2种类装载器,一种是java api,可被信任的。一种是用户自定义类装载器,即用户可以调用Class.forName()装载。但是没有看见用户可以手工卸载类的方法。
我想这具体jvm的的实现有关:正如GC一样,在程序里即使显示调用GC并不能保证GC一定得到执行,只有当达到某种条件时GC才执行。同样:也许jvm有类似的类卸载机制。不过现在好像没有提供接口。
sun应该提供给程序员类似于GC的接口来手工对类进行卸载。
TinyJimmy
2006-08-19
打赏
举报
回复
应该是不可能地
ll42002
2006-08-19
打赏
举报
回复
这个手动肯定是不行的,因为在你手动卸载的时候,JVM并不知道这个类型是否被引用,所以手动肯定不行。
但是GC会自动卸载那些不用的类型,这个你可以看看《深入JAVA虚拟机(第二版)》中关于垃圾回收章节的叙述。
UnAgain
2006-08-19
打赏
举报
回复
顶
bigc2000
2006-08-19
打赏
举报
回复
To UnAgain() ( ) 信誉:98
我说的是类的加载,而不是类的实例加载,
我说的是类本身的卸载,而不是类实例的内存回收。
还是那句话。一个类可能被由其他线程或者本地方法加载的,假设外部可以强制卸载这个类,
那么也就是说这个类的说明全部没有了她的相关信息也就没有了,而如果有个其他线程
调用Class c = Class.forName("calssName");
那么按照你的说法,改线程就必须重新加载这个类,并且初始化,而这个类的加载确实透明的(用户无法知道是不是这个类已经被加载过),这显然不符合java设计思想(让程序员远离繁琐的内存的分配与回收)
最坏的情况是1个在unload,一个在load
boxigroup
2006-08-19
打赏
举报
回复
欢迎光监点石成金网 http://www.boxigroup.com 网站提供web开发(j2ee .net asp php javascript、c#等) c/s开发(delphi、vb、vc、pb、cb等) 数据库开发(oracle、sqlserver、db2、access、mysql、Postgresql、informix)等学习资料,希望能为你解决燃眉之急 ,请把本网站加入收藏夹,以备不时查询之需 bs+cs讨论群(9638134)
碧海情天-赵亮
2006-08-19
打赏
举报
回复
想这种问题没用,真想明白,只有去问SUN了,但它会告诉你"难道你没听过..."
产品说明书在那,说得很明白了.冰箱厂家是不会考虑回答你如何让冰箱变烤箱的
UnAgain
2006-08-17
打赏
举报
回复
有点意思。
但是我能不能用平常的写法?比如
MyClass myClass = new MyClass();
treeroot
2006-08-15
打赏
举报
回复
这个问题好像很难处理,只有加载类的类加载器不可用时,加载的类才能被回收。
所以需要自定义类加载器。
void method(){
ClassLoader loader=new MyClassLoader();
Class c=loader.loadClass("XXXXX");
...
..
退出之后可以被回收了
}
同一个类可以被不同的类加载器加载
UnAgain
2006-08-15
打赏
举报
回复
To bigc2000(公元2005年4月9日):
我说的unload不透明指的是unload class,而不是unload object。
我为什么强调unload class是因为我的一个小程序在开始的时候要用到一个类,然而以后不再用到。所以我考虑如果在内存紧张的情况下,最好能unload class。
正是因为JVM开发者不会知道用户被unload的类会不会需要reload,所以,应该把这个功能做成不透明的,仅由开发人员自己选择。
bigc2000
2006-08-09
打赏
举报
回复
注:loadClass 是一个很费时费事的。
bigc2000
2006-08-09
打赏
举报
回复
楼主说,不应该透明?
其实我觉得这就是java相对C的优势之一,对内存的直接操作都被屏蔽掉。用户不必关心
内存的分配与回收。
而且如果你说unload不透明,那么同时加载类又是透明的,那么程序员岂不多操心了?
何时何地该unload?如果Reload怎么办?有线程在Reflect中调用该类,而你却把他给unload了
那岂不是频繁unload ,reload
本人不才,没有什么更好的想法,觉得java的GC机制很好
bigc2000
2006-08-09
打赏
举报
回复
加载类,类只占用其本身说明的空间,没有多少。
A class or interface may be unloaded if and only if its class loader is unreachable. Classes loaded by the bootstrap loader may not be unloaded.
看来如果有必要jvm会去做这件事情。
但我想,如果空间够用,jvm肯定不会去做,因为这个类又可能被其他的ClassLoader再次加载
加载更多回复(23)
从
JVM
分析Java的
类
的加载和
卸载
机制
主要介绍了从
JVM
分析Java的
类
的加载和
卸载
机制,讲解了Java
类
的声明周期,需要的朋友可以参考下
sybase 完全
卸载
sybase 完全
卸载
通过注册表完全
卸载
sybase
Java虚拟机
JVM
类
加载初始化
1):本地编译好的class中直接加载 2):网络加载:java.net.URLClassLoader可以加载url指定的
类
3):从jar、zip等等压缩文件加载
类
,自动解析jar文件找到class文件去加载util
类
4):从java源代码文件动态编译成为class文件 当一个
类
被加载、连接、初始化后,它的生命周期就开始了,当代表该
类
的Class对象不再被引用、即已经不可触及的时候,Class对象的生命周期结束。那么该
类
的方法区内的数据也会被
卸载
,从而结束该
类
的生命周期。一个
类
的生命周期取决于它Class对象的生命周期。由Java虚拟机自带的默认加载器(根加载器、扩展加载器、系统加载器)所加载的
类
在
JVM
生命周期中始终不被
卸载
。所以这些
类
的Class对象(我称其为实例的模板对象)始终能被触及!而由用户自定义的
类
加载器所加载的
类
会被
卸载
掉!
JVM
面试题总结.md
JVM
面试题总结 -
JVM
面试题总结 -
JVM
的主要作用是什么? - 请你描述一下 Java 的内存区域? - 请你描述一下 Java 中的
类
加载机制? - 加载 - 验证 - 准备 - 解析 - 初始化 - 使用 -
卸载
- 在
JVM
中,对象是如何创建的? - 内存分配方式有哪些呢? - 请你说一下对象的内存布局? - 对象头 Header - 实例数据 Instance Data - 对齐 Padding - 对象访问定位的方式有哪些? - 如何判断对象已经死亡? - 如何判断一个不再使用的
类
? -
JVM
分代收集理论有哪些? - 聊一聊
JVM
中的垃圾回收算法? - 标记-清除算法 - 标记-复制算法 - 标记-整理算法 - 什么是记忆集,什么是卡表?记忆集和卡表有什么关系? - 什么是卡页? - 什么是写屏障?写屏障带来的问题? - 什么是三色标记法?三色标记法会造成哪些问题? - 请你介绍
《剑指offer》
JVM
面试题总结.pdf
JVM
面试题总结
JVM
的主要作用是什么? 请你描述一下 Java 的内存区域? 请你描述一下 Java 中的
类
加载机制? 加载 验证 准备 解析 初始化 使用
卸载
在
JVM
中,对象是如何创建的? 内存分配方式有哪些呢? 请你说一下对象的内存布局? 对象头 Header 实例数据 Instance Data 对齐 Padding 对象访问定位的方式有哪些? 如何判断对象已经死亡? 如何判断一个不再使用的
类
?
JVM
分代收集理论有哪些? 聊一聊
JVM
中的垃圾回收算法? 标记-清除算法 标记-复制算法 标记-整理算法 什么是记忆集,什么是卡表?记忆集和卡表有什么关系? 什么是卡页? 什么是写屏障?写屏障带来的问题? 什么是三色标记法?三色标记法会造成哪些问题? 请你介绍一波垃圾收集器 Serial 收集器 ParNew 收集器 Parallel Scavenge 收集器 Serial Old 收集器 Parallel Old 收集器 CMS 收集器 Garbage First 收集器
JVM
常用命令介绍 什么是双亲委派模型? 双亲委派模型的缺陷? 双亲委派机制的三次破坏
Java SE
62,614
社区成员
307,326
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章