回收规则跟普通变量回收规则一样,比如: 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只会回收java堆上的内存,java栈里面情况完全不同,谈不上回收,java堆和堆、java栈和栈分别是2个不同的概念。另 楼主你想表述的意思是 class MyClass { public static Object sObject = new Object(); };sObject 这个引用的本体sObject本身被回收吧?它是不会被回收的,但是new Object()这个本体是可以被回收的,只要sObject被修改的引用或者sObject = null;时 它原先的引用的对象就会到java堆中被回收。
public class Test {
private int i = 111;
private Object a = null;
}public void test() {
int i = 111;
Object a = null;
}
不要考虑对象回收,对象回收跟变量回收并不相同。
gc只会回收java堆上的内存,java栈里面情况完全不同,谈不上回收,java堆和堆、java栈和栈分别是2个不同的概念。另 楼主你想表述的意思是
class MyClass {
public static Object sObject = new Object();
};sObject 这个引用的本体sObject本身被回收吧?它是不会被回收的,但是new Object()这个本体是可以被回收的,只要sObject被修改的引用或者sObject = null;时 它原先的引用的对象就会到java堆中被回收。
对C/C++学得深点的同鞋都清楚OS给程序分配的内存组成:静态内存(static)与动态内存(auto)。其中静态内存区在Java中被称为“永久区”,由于其硬件特性通常用来存放不经常变动的数据:全局变量、静态变量,OOP中增加的类声明、类变量(记得上面有人说到标记static的类变量存放在栈中,这理解是错误的,它们实际上存储在“永久区”)。
对动态内存区,OS给划分成两大部分:栈和堆。
对高级语言来说,栈内存的管理实际上是由编译器完成的:在进行函数调用时入栈,函数返回时出栈。不管是对于静态内存还是栈的管理都有个前提:需要分配的内存大小都是已知的,编译器可以通过一个简单的加法运算算出自己要找的内存地址。但有时我们想要分配的内存大小不是已知的,有的甚至需要在运行时计算分配内存的空间大小。用于解决这一问题就是动态内存中的另一区域:堆。堆内存的管理是由程序员自己完成的,这在C/C++中称为“动态内存分配”。例如在C++中,既有用于申请堆内存的关键字new,也有用于释放内存的关键字delete。C/C++程序设计的原则之一就是申请的内存一定要释放掉。有时因为代码太长了而出现忘记释放内存而经常在程序运行后留下所谓的内存垃圾。为了避免内存垃圾的堆积而影响计算机性能,最早在C++出现了定时释放无用内存的组件——也就是GC的前身。总结起来,GC是为了避免程序员忘记释放内存而出现的,那么它所能回收的内存区域只能是程序员自己管理的内存区域——堆。
如果 一个类的里面的int 属性 , 那个类用完了 之后 那个int 会回收么 还是那个值不会回收?
大伙都看看这文章吧
sorry