-
问个折磨人的java问题10
java中的方法会不会被GC? 它的生命周期有多长? 方法中的变量是如何被分配的?生命周期又是如何?
问题补充
我是知道啊~~就是想看看有多少人有深入去看jvm
问题补充风花雪月饼 写道方法被gc?
静态方法?
静态方法不会。启动就存在了。
方法?也不会把,以实例来作为GC的吧。
比如
user.validate()
总不能validate被GC了嘛。
validate中定义的变量会被gc
那指令呢?
2008年12月08日 10:25
5个答案 按时间排序 按投票排序
-
采纳的答案
首先要区分清code和data。以后JVM很可能会有新的机制来允许方法(code)被GC,例如说通过新的AnonymousLoader、MethodHandle等机制。但就现在的JVM来说,code一旦被ClassLoader给load进来之后就放在PermGen heap上,基本上直到程序终止前都不会被GC了。据说Java 6 Update 4还是多少开始有个新的启动参数,-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses,不过没仔细看不知道到底能达到怎样的效果。
Java中的code是以类为单位保存在class文件里的。Class文件里含有类的名称、继承关系、常量池,以及各个静态/成员方法的字节码。JVM在加载程序的时候也是以类为单位来加载的,code会被加载到称为"Permanent Generation"(PermGen)的堆上。
类的静态变量是在其被加载时先分配空间(可以认为也是在PermGen里),然后初始化。其生命周期与类的code的生命周期一样长。
成员变量则是在new新的实例时分配空间,并由默认初始化器和构造器等初始化。其生命周期与实例的周期相关。注意这里说的生命周期是单纯指primitive type或者reference自身,而不包括reference指向的对象。举例来说,假如一个实例a的成员x被赋为null了,那么这个null值仍然要保存在a里,在32位系统上这就意味着至少占用了4个字节。
方法中的局部变量概念上说是在栈上分配空间的,其生命周期与方法调用的周期一样,也就是说方法调用过后空间就会被回收。注意这里指的同样是primitive type或者reference自身,而不包括reference所指向的对象。再举个例子的话,假如在方法里有这么一句:String s = new String("abc");
则"abc"是在常量池里分配空间的,s现在所指向的刚new出来的对象(作为一个实例)是在第0代堆里分配空间,而s(作为一个引用)自身概念上是在栈上分配空间的。方法结束时,s自身的空间会被回收,但s所指向的对象是否被回收取决于是否还存在指向它的活引用。
之所以说是“概念上在栈上分配空间”是因为JVM有可能会将局部变量优化为直接分配在寄存器上,不过这是实现细节,对上层的程序员并没有可见的影响。
基本上就是这样吧……2008年12月09日 22:44
-
GC是针对 在堆中开辟的内存 进行回收变为再次可用。
在java中,取消了手动释放堆内存,为了更安全着想,由JVM自行管理。
也就是所谓的 垃圾回收器。
如果当一个实例 失去引用的时候
例如: Object a = new Object();
a= null;
哪么,这个实例将列入垃圾回收列表。
垃圾回收器,在认为合适的时候,才统一的释放其 所有(在程序中失去引用的对象)的内存。
jdk版本的不同。GC工作方式也不同,但目的都是相同的都是释放堆内存。
方法中的变量 是在栈中开辟的。 当程序离开 方法{} 作用域后。局部变量立即销毁。
由于栈 是通过指针移动来访问数据的,其速度仅次于 CPU直接访问一缓效率。2008年12月08日 13:34
-
没细看过 JVM。通过常识来判断。
任何方法都是跟着class走的。
如果class被GC,方法才会被GC。
方法的生命周期同class一样。
方法中的局部变量分配在运行栈上,生命周期就在 { } 范围内。超出范围,应该很快就会被GC。2008年12月08日 10:25
-
方法被gc?
静态方法?
静态方法不会。启动就存在了。
方法?也不会把,以实例来作为GC的吧。
比如
user.validate()
总不能validate被GC了嘛。
validate中定义的变量会被gc2008年12月08日 10:25
相关推荐
内容摘要中提到,在当前的计算机编程教育中,如何有效地培养IT行业和学术界所需的熟练程序员已经成为全球大学计算机教育者面临的最严重问题之一。传统上,通过教授编程课程,学生理应掌握编程理论和技能,并构建其...
不断困扰视窗所有开发人员都可以解决此问题并更新其回购文档 利益各不相同的职业危害 应用金融中的机器学习 深度深Tra学习 应用AI / ML / DL实现交易自动化 开放式社会化对冲基金管理 高频交易(HFT) 高性能并行...
Aria项目源于工作中遇到的一个文件下载管理的需求,当时被下载折磨的痛不欲生,从那时起便萌生了编写一个简单易用,稳当高效的下载框架,aria经历了1.0到3.0的开发,算是越来越接近当初所制定的目标了。
我们认为,Asta4D提供了对上述问题的完美答案,Asta4D通过分离的模板和代码向前端工程师提供了最为友好的工作环境,而另一方面,后端开发人员再也不必受到模板语言的折磨,Java将成为他们手中最趁手的武器,而且,...
从上大学以来,饱受小蝴蝶折磨,不让接路由,不让换电脑,不能开Wifi,不能用虚拟机,一人一电脑一网线!什么鬼!最重要的是网速才TMD 2兆!2兆!2兆!够干嘛吃的,还死贵死贵!饱受折磨呀。。。 目前主流的...
当一些人陶醉于EJB的深奥理论时,另外一些人却正被EJB的繁琐复杂所折磨;尝到EJB甜头的人,在EJB的每个新版本中,都能发现盼望已久的惊喜,而被EJB拒之门外的人,则随着EJB的升级,愈发对EJB敬而远之了。EJB的全称是...
回答常见问题:在你的机构内,任何一个回答电话问题的人都会告诉你,他们的时间主要花在一遍又一遍地回答相同的问题上。这些问题是客户或潜在客户在跟你做买卖之前想搞清楚的地方。如果我们能后把它们放到WWW页面上...
要在linux下安装git,首先你得先有一台linux服务器,作为小白,手头的机器肯定都是windows的,搞个虚拟机安装对我这种小白简直是折磨人;这里使用最简单的方式获得一台linux服务器,就是从阿里云上租一台。镜像选择...
使用Django Rest Framework用Python编写的开源API。 它被设计为可扩展,可... 患者的心理健康不是服务的主要目标,而是为那些遭受生物学和机体性疾病折磨的人提供帮助。 正是基于此,Laçosda Alegria致力于解决住院病