博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
classLoader卸载与jvm热部署
阅读量:6897 次
发布时间:2019-06-27

本文共 1599 字,大约阅读时间需要 5 分钟。

  以下的相关介绍都是在未使用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
public static Map pool = new HashMap();     public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
for (int i=0;i<10000000;i++){
test(args); } } public static void test(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
ClassLoader cl = new MyLoader(Main.class.getClassLoader()); String className = "RealPerson"; @SuppressWarnings("unchecked") Class
clazz = (Class
) cl.loadClass(className); Person p = clazz.newInstance(); p.setName("qiang"); pool.put(System.nanoTime(), p); 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的相关接口,来对内存的引用关系进行了修改

 

redcreen

转载于:https://www.cnblogs.com/cxhfuujust/p/8316897.html

你可能感兴趣的文章
【调试】Core Dump是什么?Linux下如何正确永久开启?
查看>>
新浪微博API授权
查看>>
电子政务网中信息共享机制的重要性
查看>>
【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类
查看>>
Struts2的配置
查看>>
[BZOJ1296][SCOI2009]粉刷匠(DP)
查看>>
Executor执行框架
查看>>
[FMX] Android APP 启动黑屏优化补丁
查看>>
常用JavaScript的高级技巧
查看>>
bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘
查看>>
mac编辑器vim美化
查看>>
MD5摘要算法简析
查看>>
《30天自制操作系统》学习笔记一
查看>>
Python.tornado.2.tornado.options
查看>>
mysql关于or的索引问题
查看>>
装在u盘的linux
查看>>
ASP.NET几种页面数据绑定的用法及区别: <%#、 <%=、 <% 、<%@
查看>>
zookeeper
查看>>
ABP源码分析二十四:Notification
查看>>
Photo4
查看>>