[Quote=引用 24 楼 zangxt 的回复:]
引用 19 楼 silentbalanceyh 的回复:
Java变量的存储和这个变量是否是静态变量、实例变量、块变量和局部变量没有直接的关系,关键在于该变量是一个原始变量还是一个对象的引用。针对Java的原始变量char/long/int/short/byte/float/double/boolean而言,它的存储模型就是针对内存栈的,它不存在把内容存储到内存堆的概念,只有对象的存储会牵涉到内存堆,例如:
int a = 0;
这样一句就是直接存储了该变量的值到内存栈的
A a = new A();
只有这样的格式才会存在将引用存到内存栈,将对象内从存储到内存堆里面。
[Quote=引用 19 楼 silentbalanceyh 的回复:]
Java变量的存储和这个变量是否是静态变量、实例变量、块变量和局部变量没有直接的关系,关键在于该变量是一个原始变量还是一个对象的引用。针对Java的原始变量char/long/int/short/byte/float/double/boolean而言,它的存储模型就是针对内存栈的,它不存在把内容存储到内存堆的概念,只有对象的存储会牵涉到内存堆,例如:
int a = 0;
这样一句就是直接存储了该变量的值到内存栈的
A a = new A();
只有这样的格式才会存在将引用存到内存栈,将对象内从存储到内存堆里面。
比如
class Test{
int i;//自然要随对象分配在堆里
publi void test(){
int j;//方法执行时才分配空间,在栈里
}
}
[/Quote] 这种说法有点问题,虽然i是Test对象里面的内容,但是存储的时候还是存在内存栈上的,因为它不是对象创建的时候进行内存的管理,二是在Test对象进行初始化的时候进行的内存分配,主要还是牵涉到一个对象生命周期的管理问题。对象里面的属性也是严格按照JVM的存储模型来进行操作的,上边代码里面i是属于对象Test的,但是存储的时候和对象不是一样的存法
Java变量的存储和这个变量是否是静态变量、实例变量、块变量和局部变量没有直接的关系,关键在于该变量是一个原始变量还是一个对象的引用。针对Java的原始变量char/long/int/short/byte/float/double/boolean而言,它的存储模型就是针对内存栈的,它不存在把内容存储到内存堆的概念,只有对象的存储会牵涉到内存堆,例如:
int a = 0;
这样一句就是直接存储了该变量的值到内存栈的
A a = new A();
只有这样的格式才会存在将引用存到内存栈,将对象内从存储到内存堆里面。
[Quote=引用 30 楼 hz_haoyu 的回复:]
Object o = new Object(); //线程执行到这里的时候,o的变量在哪里,new Object()在哪里?
static Object o = new Object(); //线程执行到这里的时候,o的变量在哪里,new Object()在哪里?
堆(Heap)
运行时数据区域,所有类实例和数组的内存均从此处分配。Java 虚拟机启动时创建。对象的堆内存由称为垃圾回收器 的自动内存管理系统回收。
组成
News Generation (Young Generation即图中的Eden + From Space + To Space)
Eden 存放新生的对象
Survivor Space 两个 存放每次垃圾回收后存活的对象
Old Generation (Tenured Generation 即图中的Old Space) 主要存放应用程序中生命周期长的存活对象