java的类加载后什么时候会被释放?
java的类在第一次需要创建类的实例(对象)时被加载,想知道什么时候这个类会被释放?(不是问对象什么时候释放哈)。想实现这样一个过程:自己编写的类加载器加载(AppCla...
java的类在第一次需要创建类的实例(对象)时被加载,想知道什么时候这个类会被释放?(不是问对象什么时候释放哈)。
想实现这样一个过程:自己编写的类加载器加载(AppClass Loader),这个类加载器将从网络上获取.class文件。然后网络就关闭,也就是class文件来源就关闭了。问题是想知道这个已经加载的类会不会在内存紧张时被java的垃圾回收器而回收,从而导致程序在创建这个类的新实例时出错。呵呵,我对java的垃圾回收器知道的很少,学艺不精,所以还望大手指点下小弟,谢谢! 展开
想实现这样一个过程:自己编写的类加载器加载(AppClass Loader),这个类加载器将从网络上获取.class文件。然后网络就关闭,也就是class文件来源就关闭了。问题是想知道这个已经加载的类会不会在内存紧张时被java的垃圾回收器而回收,从而导致程序在创建这个类的新实例时出错。呵呵,我对java的垃圾回收器知道的很少,学艺不精,所以还望大手指点下小弟,谢谢! 展开
4个回答
展开全部
java的类加载后且当使用阶段完成之后,java类就进入了卸载阶段,也就是所谓的释放。
使用阶段包括主动引用和被动引用,主动饮用会引起类的初始化,而被动引用不会引起类的初始化。
一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况,如图所示:
PS:关于类的卸载,在类使用完之后,如果满足下面的情况,类就会被卸载:
该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收。
该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。
展开全部
首先,"java的类在第一次需要创建类的实例(对象)时被加载"这个说的不对
java中类被使用就就会时就会被加载到内存(比如反射等)
然后回答你的问题。
首先要介绍下相关知识(基础知识纯属拷贝):
首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域
方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区域,叫做方法区。
常量池:常量池是方法区的一部分,主要用来存放常量和类中的符号引用等信息。
堆区:用于存放类的对象实例。
栈区:也叫java虚拟机栈,是由一个一个的栈帧组成的后进先出的栈式结构,栈桢中存放方法运行时产生的局部变量、方法出口等信息。当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果方法中调用了其他方法,则继续在栈顶创建新的栈桢。
除了以上四个内存区域之外,jvm中的运行时内存区域还包括本地方法栈和程序计数器,这两个区域与java类的生命周期关系不是很大,在这里就不说了,感兴趣可以自己百度一下。
其实类在JVM里面有以下几个阶段:
加载 -- 连接 -- 初始化 -- 使用 -- 卸载
主要给你说明卸载:
在类使用完之后可能会被卸载,可能性如下:
如果有下面的情况,类就会被卸载:
该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收。
该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。
java中类被使用就就会时就会被加载到内存(比如反射等)
然后回答你的问题。
首先要介绍下相关知识(基础知识纯属拷贝):
首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域
方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区域,叫做方法区。
常量池:常量池是方法区的一部分,主要用来存放常量和类中的符号引用等信息。
堆区:用于存放类的对象实例。
栈区:也叫java虚拟机栈,是由一个一个的栈帧组成的后进先出的栈式结构,栈桢中存放方法运行时产生的局部变量、方法出口等信息。当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果方法中调用了其他方法,则继续在栈顶创建新的栈桢。
除了以上四个内存区域之外,jvm中的运行时内存区域还包括本地方法栈和程序计数器,这两个区域与java类的生命周期关系不是很大,在这里就不说了,感兴趣可以自己百度一下。
其实类在JVM里面有以下几个阶段:
加载 -- 连接 -- 初始化 -- 使用 -- 卸载
主要给你说明卸载:
在类使用完之后可能会被卸载,可能性如下:
如果有下面的情况,类就会被卸载:
该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收。
该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-11-15
展开全部
从网络取到.class,然后保存在本地的临时目录,就好了。
这个什么时候从内存清除,是由jre决定,是会在系统资源紧张时处理的
这个什么时候从内存清除,是由jre决定,是会在系统资源紧张时处理的
追问
非常感谢谢您的帮助!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序结束后吧,,不然都在方法区放着的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询