能不能从jvm卸载类?

UnAgain 2006-08-01 05:27:49
第一次用到一个类的时候,ClassLoader会把该类加载到jvm,是吧?
那么有没有办法从jvm卸载该类呢?


我是基于这样的考虑才提出这个问题的:

比如我在应用里要用到DOMParser,但仅仅在应用开始的时候使用一次,而该类及其相关类却要一直存在,直到应用结束。这样是不是有点浪费资源?

小程序当然无所谓,但是对于一个大的应用,这个问题恐怕不能不考虑

先给20分,有回答会再增加100
...全文
1047 43 打赏 收藏 转发到动态 举报
写回复
用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)
  • 打赏
  • 举报
回复
想这种问题没用,真想明白,只有去问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)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧