关于class loader的一点疑惑

尼古拉希 发布于 2015/04/29 18:01
阅读 150
收藏 0

项目中有个需求是加载外部jar文件获得class文件,所以重写了UrlClassLoader来动态加载,但是系统在运行了一段时间出现java.lang.OutOfMemoryError: PermGen space,直觉上觉得是这种设计出现的问题,查了一些资料,在百度百科上看到一段话

在什么时候一个java class/interface会被卸载呢?Sun公司的原话是这么说的:"class or interface may be unloaded if and only if its class loader is unreachable. Classesloaded by the bootstrap loader may not be unloaded."
看到这句话好像发现问题了,在编码之初为了防止不同的classloader加载出的class类型不一致所以把classloader设计成了单例。

这样就走到了一个死胡同,要保证classloader加载到的class类型一致必须使用同一个loader,但是class又无法unload。

以上是我的理解,不知道对不对,恳求朋友们指正告知问题的原因或解决办法、解决思路,跪谢!

加载中
0
呵呵3547
呵呵3547

PermGen space的错误是不是你的JVM的PermSize设置的太小了。sum的JVM加载的class文件会放到PermSize里。如果放不下就会报这个错,把permSize设置大一点试试。

PermSize里的加载的类只有当classloader卸载时才会被垃圾回收的。

尼古拉希
尼古拉希
谢回复,PermGen设置的512M,已经很大了
返回顶部
顶部