第一次用到一个类的时候,ClassLoader会把该类加载到jvm,是吧?
那么有没有办法从jvm卸载该类呢?
我是基于这样的考虑才提出这个问题的:比如我在应用里要用到DOMParser,但仅仅在应用开始的时候使用一次,而该类及其相关类却要一直存在,直到应用结束。这样是不是有点浪费资源? 小程序当然无所谓,但是对于一个大的应用,这个问题恐怕不能不考虑 先给20分,有回答会再增加100
那么有没有办法从jvm卸载该类呢?
我是基于这样的考虑才提出这个问题的:比如我在应用里要用到DOMParser,但仅仅在应用开始的时候使用一次,而该类及其相关类却要一直存在,直到应用结束。这样是不是有点浪费资源? 小程序当然无所谓,但是对于一个大的应用,这个问题恐怕不能不考虑 先给20分,有回答会再增加100
解决方案 »
- 求推荐eclipse 3.7(indigo)可用的Swing插件
- 搜索引擎用户界面制作
- java异常处理问题
- 还是编码问题!!!!
- 急!!用什么软件编写java可以在调试时查看变量值
- java中如何对word进行编程?
- 按钮按下去之后是否在ActionPerformed执行完了之后才弹起来的啊?
- Java 命令行参数调试的问题
- 80分!最近有个想法,用JAVA做仿PB中的datawindow,给用户做二次定义开发工具,欢迎讨论
- 急!高分求助:水晶报表在Web上的打印问题
- [请教]相同的线程,重复执行的问题?
- 100分,请问如何让页面中的图片自动刷新啊?IE文字自动刷新可以,图片为什么老读缓存中的?
而这很可能是我们不希望的这个问题可以给sun提一下
而且对GC的调用并不一定能立刻执行“垃圾回收”
http://java.sun.com/docs/books/jls/unloading-rationale.html
-Xnoclassgc disable class garbage collection这也许能说明 Sun 提供的 JDK 是考虑了 class unloading 的吧……当然,这是 Sun 在实现 JVM 的时候做的扩展,并不是 Java Language Specification 的要求。我倾向与认为,class unloading 的事情应该交给 JVM 去处理,应用程序不必直接介入。
> 然后所有的java类和jar文件都通过这个程序来运行。
> 这个程序负责调用已有的JVM来运行这些java程序。
> 不过,问题在于,如果一个程序崩溃了,所有的程序都会受到影响。嗯,不错,听起来挺有道理 :D但是麻烦事还是有一些的,比如,每个程序的 CLASSPATH 可能不尽相同,怎么办呢?总不能让每个程序都像 Tomcat 那样自己带一套 ClassLoader 吧?Anyway, 大体上是差不多的了。程序间的相互影响是不好解决,毕竟线程之间的隔离不像进程间隔离得那么清楚。不过在典型的桌面应用背景下(不是调试环境),多个比较成熟稳定的应用程序要是能共用一个 JVM 还是个不错的选择。相对于一个小的应用程序,JVM 的“额外开销”实在太大了,但却不能省掉,就像仅仅运行一个记事本,也必须启动整个 Windows 一样(顶多来个“安全模式”,也没小到哪去)
To flyforlove(为情飞),hbwhwang(我是catmiw的马甲):我觉得这篇文章是sun的狡辩。这种优化对于应用不应该是透明的,而应该由具体的应用自己选择,sun应该提供方便的接口方法以供特定的应用调用。另外,每启动一个java应用都要重新加载一个新的JVM。这些状况不改变的话,java的桌面开发恐怕难有太大的发展。
-------------------关键是连类的实例都是由jvm来管理的,更何况类本身呢,如果连类的实例我们都不知道什么时候释放,怎么可以去释放类呢。
而且,我觉得在java中释放类比释放实例更加困难。
我的问题:销毁一个对象的函数? 100分(楼主冒犯了)
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再次加载
其实我觉得这就是java相对C的优势之一,对内存的直接操作都被屏蔽掉。用户不必关心
内存的分配与回收。
而且如果你说unload不透明,那么同时加载类又是透明的,那么程序员岂不多操心了?
何时何地该unload?如果Reload怎么办?有线程在Reflect中调用该类,而你却把他给unload了
那岂不是频繁unload ,reload
本人不才,没有什么更好的想法,觉得java的GC机制很好
所以需要自定义类加载器。void method(){
ClassLoader loader=new MyClassLoader();
Class c=loader.loadClass("XXXXX");
...
..
退出之后可以被回收了
}
同一个类可以被不同的类加载器加载
有点意思。但是我能不能用平常的写法?比如
MyClass myClass = new MyClass();
但是GC会自动卸载那些不用的类型,这个你可以看看《深入JAVA虚拟机(第二版)》中关于垃圾回收章节的叙述。
产品说明书在那,说得很明白了.冰箱厂家是不会考虑回答你如何让冰箱变烤箱的
我说的是类的加载,而不是类的实例加载,
我说的是类本身的卸载,而不是类实例的内存回收。还是那句话。一个类可能被由其他线程或者本地方法加载的,假设外部可以强制卸载这个类,
那么也就是说这个类的说明全部没有了她的相关信息也就没有了,而如果有个其他线程
调用Class c = Class.forName("calssName");
那么按照你的说法,改线程就必须重新加载这个类,并且初始化,而这个类的加载确实透明的(用户无法知道是不是这个类已经被加载过),这显然不符合java设计思想(让程序员远离繁琐的内存的分配与回收)
最坏的情况是1个在unload,一个在load
我指的是如果程序员自己知道一个类在一次用过之后,可以确保以后不再使用的情况下,sun应该给程序员提供一个选择。
我指的是如果程序员自己知道一个类在一次用过之后,可以确保以后不再使用的情况下,sun应该给程序员提供一个选择。
--------------------------------但是你都不知道类的实例什么时候释放的,你怎么可能知道这个类还有没有在用?