classLoader卸载与JVM热部署

开发 后端
以下的相关介绍都是在未使用dcevm的情况。

classLoader的卸载机制

jvm中没有提供class及classloader的unload方法.那热部署及osgi中是通过什么机制来实现的呢?实现思路主要是通过更换classLoader进行重新加载.之前的classloader及加载的class类在没有实例引用的情况下,在perm区gc的情况下会被回收掉。

perm区gc时回收掉没有引用的class是一个怎样的过程呢?

◆ perm区达到回收条件后,对class进行引用计算,对于没有引用的class进行回收。

◆ classLoader实例什么时候被回收呢?(很有可能会进入old gen).perm区回收一般情况下触发full gc是否目的就是清除没有实例引用此classloader?

内存问题

◆ 如果有实例类有对classloader的引用,perm区class将无法卸载,导致perm区内存一直增加,进而导致perm space error

  1. public static Map pool = new HashMap(); 
  2. public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ 
  3. for (int i=0;i<10000000;i++){ 
  4. test(args); 
  5.  
  6. public static void test(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
  7. ClassLoader cl = new MyLoader(Main.class.getClassLoader()); 
  8. String className = "RealPerson"
  9.  
  10. @SuppressWarnings("unchecked"
  11. Class<Person> clazz = (Class<Person>) cl.loadClass(className); 
  12. Person p = clazz.newInstance(); 
  13. p.setName("qiang"); 
  14. pool.put(System.nanoTime(), p); 
  15. cl = p.getClass().getClassLoader(); 

推测:

osgi的bundle进行热部署时有个条件:export class 必须是兼容的.否则需要重启整个应用才会生效,为什么呢?

 

osgi的export class是被bundle的parent classloader加载的,bundle内部其他类是bundle的classloader加载的,bundle更换后,重新创建classloader,并对bundle进行加载,之前的加载靠jmv gc回收掉。

那osgi 中explort class如果有实例引用的话,是否会导致class无法被gc掉?

如果osgi中没有做过处理,应该会出现此问题.具体osgi的实现还需要深入研究下,
也许osgi中关于此部分的实现使用了jvm内部的JMTI的相关接口,来对内存的引用关系进行了修改。

原文链接:http://www.cnblogs.com/redcreen/archive/2011/06/02/2068758.html

【编辑推荐】

  1. JVM分代垃圾回收策略的基础概念
  2. 高手深度解析:JVM是什么
  3. Java七步创建以JDBC连接数据库的程序
  4. 面试Java前必须了解的10个概念
  5. Java中关于OOM的场景及解决方法
责任编辑:林师授 来源: redcreen的博客
相关推荐

2010-09-25 11:13:18

JVMClassLoader

2010-01-15 20:09:40

centos卸载系统

2024-03-20 14:22:55

远程热部署

2023-09-11 08:31:12

自动配置热部署DevTools

2023-10-12 22:38:18

SpringBoot热部署

2021-10-24 06:50:52

AndroidClassLoaderJava

2010-09-27 08:38:49

JVM堆JVM栈

2024-08-09 08:52:26

2021-02-20 06:15:00

项目SpringBoot热部署

2009-07-10 16:17:41

JVM 1.6

2020-04-15 21:43:22

JVMJavaVMware

2009-06-17 09:40:01

JBoss的class

2013-05-16 11:16:45

Linux软件安装卸载

2010-09-26 09:20:39

JVM1.6JVM1.5

2018-11-01 10:34:37

JVM内存配置

2023-03-30 08:52:40

DartFlutter

2021-08-05 05:04:50

热部署模型字节

2022-03-17 21:42:20

美团插件技术

2011-11-23 09:39:33

JavaClassLOader机制

2021-11-21 23:03:38

jvm调优虚拟机
点赞
收藏

51CTO技术栈公众号