当前位置:编程学习 > JAVA >>

int 变量会否被gc()回收

RT
面试的时候 被问到这个问题
我知道 static 不会被回收, 但 int 等原始变量 比如  short long 等 --------------------编程问答-------------------- 只要class文件存在,那么对应java中的static就不会被回收吧。 --------------------编程问答-------------------- 只要class文件存在,那么对应java中的static就不会被回收吧。 --------------------编程问答-------------------- gc就该会回收的,当然还是先听高手的 --------------------编程问答-------------------- 基本类型变量和静态元素都是存在栈里的,但静态元素不会失去引用,而基本类型变量会失去引用。 --------------------编程问答-------------------- 回收规则跟普通变量回收规则一样,比如:
public class Test {
  private int i = 111;
  private Object a = null;
}

public void test() {
  int i = 111;  
  Object a = null;
}


不要考虑对象回收,对象回收跟变量回收并不相同。
--------------------编程问答-------------------- 那 int 的 变量 gc 会回收么 --------------------编程问答-------------------- 会回收的 --------------------编程问答-------------------- java把i当Integer的话就回收了吧 --------------------编程问答-------------------- int 是放在栈里面的,gc只回收堆里面的对象,就是new 出来的对象 --------------------编程问答-------------------- gc只会回收堆上的内存,栈里面情况完全不同,谈不上回收 --------------------编程问答-------------------- 9楼和10楼正解. --------------------编程问答-------------------- 修正一下
gc只会回收java堆上的内存,java栈里面情况完全不同,谈不上回收,java堆和堆、java栈和栈分别是2个不同的概念。

另 楼主你想表述的意思是
class MyClass {
    public static Object sObject = new Object();
};

sObject 这个引用的本体sObject本身被回收吧?它是不会被回收的,但是new Object()这个本体是可以被回收的,只要sObject被修改的引用或者sObject = null;时 它原先的引用的对象就会到java堆中被回收。
引用 10 楼  的回复:
gc只会回收堆上的内存,栈里面情况完全不同,谈不上回收
--------------------编程问答-------------------- 哪家 SB 公司问这种东西? --------------------编程问答-------------------- 出了作用域就没了吧 --------------------编程问答-------------------- gc只能回收堆上的内容。

其实Java屏蔽底层实现的做法实际上使很多接近底层实现的问题变得很难理解和解释(当然,许多人认为这部分知识是大部分程序员不需要掌握的)。

首先,GC存在的理由是什么?
对C/C++学得深点的同鞋都清楚OS给程序分配的内存组成:静态内存(static)与动态内存(auto)。其中静态内存区在Java中被称为“永久区”,由于其硬件特性通常用来存放不经常变动的数据:全局变量、静态变量,OOP中增加的类声明、类变量(记得上面有人说到标记static的类变量存放在栈中,这理解是错误的,它们实际上存储在“永久区”)。
对动态内存区,OS给划分成两大部分:栈和堆。
对高级语言来说,栈内存的管理实际上是由编译器完成的:在进行函数调用时入栈,函数返回时出栈。

不管是对于静态内存还是栈的管理都有个前提:需要分配的内存大小都是已知的,编译器可以通过一个简单的加法运算算出自己要找的内存地址。

但有时我们想要分配的内存大小不是已知的,有的甚至需要在运行时计算分配内存的空间大小。用于解决这一问题就是动态内存中的另一区域:堆。堆内存的管理是由程序员自己完成的,这在C/C++中称为“动态内存分配”。例如在C++中,既有用于申请堆内存的关键字new,也有用于释放内存的关键字delete。

C/C++程序设计的原则之一就是申请的内存一定要释放掉。有时因为代码太长了而出现忘记释放内存而经常在程序运行后留下所谓的内存垃圾。为了避免内存垃圾的堆积而影响计算机性能,最早在C++出现了定时释放无用内存的组件——也就是GC的前身。

总结起来,GC是为了避免程序员忘记释放内存而出现的,那么它所能回收的内存区域只能是程序员自己管理的内存区域——堆。 --------------------编程问答-------------------- 同意14楼。变量本身随着包含它的类被回收。 --------------------编程问答-------------------- 看在哪如果是局部变量的话会的+ --------------------编程问答-------------------- 这个应该是分情况吧。

如果这个int在堆那么有可能会被gc()回收。

如果在栈,那就不会被会gc()回收,会随着栈帧出栈而自然就被回收掉了。 --------------------编程问答--------------------
引用 10 楼  的回复:
gc只会回收堆上的内存,栈里面情况完全不同,谈不上回收


如果 一个类的里面的int 属性  , 那个类用完了 之后 那个int 会回收么 还是那个值不会回收? --------------------编程问答-------------------- 不懂绑定咯 --------------------编程问答-------------------- 1 变量属于类,那么永远不会被回收
2 变量属于实例,则实例被回收才会被顺便回收
3 变量属于实例的方法,那么他是在堆栈中临时的,方法结束了,堆栈自动释放了,无需回收。 --------------------编程问答-------------------- 楼上错了一大排,谁说int变量就一定是在栈里的?int类型的类成员变量跟对象一起保存在堆里! --------------------编程问答--------------------
引用 21 楼  的回复:
1 变量属于类,那么永远不会被回收
2 变量属于实例,则实例被回收才会被顺便回收
3 变量属于实例的方法,那么他是在堆栈中临时的,方法结束了,堆栈自动释放了,无需回收。

老紫竹才是真正的正解!!! --------------------编程问答-------------------- --------------------编程问答-------------------- int类型变量是不会被GC回收的,只是JVM会管理栈,当因各种原因进行出栈操作时,这种类型变量会被自动释放。 --------------------编程问答-------------------- http://yiliner.iteye.com/blog/207723
大伙都看看这文章吧 --------------------编程问答--------------------
引用 13 楼  的回复:
哪家 SB 公司问这种东西?

你也这么彪悍。 --------------------编程问答--------------------
引用 21 楼  的回复:
1 变量属于类,那么永远不会被回收
2 变量属于实例,则实例被回收才会被顺便回收
3 变量属于实例的方法,那么他是在堆栈中临时的,方法结束了,堆栈自动释放了,无需回收。


讲解的很透彻! --------------------编程问答--------------------
引用 4 楼  的回复:
基本类型变量和静态元素都是存在栈里的,但静态元素不会失去引用,而基本类型变量会失去引用。

正解 --------------------编程问答-------------------- 顶21楼!!! --------------------编程问答--------------------
引用 21 楼  的回复:
1 变量属于类,那么永远不会被回收
2 变量属于实例,则实例被回收才会被顺便回收
3 变量属于实例的方法,那么他是在堆栈中临时的,方法结束了,堆栈自动释放了,无需回收。

学习啦... --------------------编程问答-------------------- 大伙看了那篇文章没 --------------------编程问答-------------------- 超脱总结 14楼
bs :傻逼出个这个垃圾问题
赞15楼原理+耐心 --------------------编程问答-------------------- 错了 :超脱总结为21楼
sorry --------------------编程问答--------------------
引用 14 楼 zqfddqr 的回复:
出了作用域就没了吧


感觉这个靠谱一些。

--------------------编程问答-------------------- int 不会被回收,在堆中的对象才会被回收
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,