示例代码Class MyEntity{
static MyEntity= new MyEntity()
}我们知道堆内存的:年轻代,年老代,持久代
当jvm启动的时候我想知道上面的代码,产生了哪些数据,这些数据去了堆内存的那一块。
先说说我的理解,希望说得不对的地方大侠们能指出一下。
Class MyEntity 这个类信息被存在持久代了
static MyEntity 也被存在持久代了
new MyEntity()这个实例会存在哪里呢?我猜测也在持久代,但没有相关的文献证明。希望大家能帮忙解释一下。
static MyEntity= new MyEntity()
}我们知道堆内存的:年轻代,年老代,持久代
当jvm启动的时候我想知道上面的代码,产生了哪些数据,这些数据去了堆内存的那一块。
先说说我的理解,希望说得不对的地方大侠们能指出一下。
Class MyEntity 这个类信息被存在持久代了
static MyEntity 也被存在持久代了
new MyEntity()这个实例会存在哪里呢?我猜测也在持久代,但没有相关的文献证明。希望大家能帮忙解释一下。
持久代是用来存放类信息的,new MyEntity()这是产生了一个实例,它是不会放到持久代的,从你的代码来看,它是存在年轻代。只有当年轻代空间不够,又无法回收可用空间时,它才会转移到老年代。
static MyEntity me = new MyEntity()
请问me 也放在年老代了吗?
new MyEntity() 应该是如你所说的那样,我的误解主要来自static 关键字,因为我记得曾经看过一些文章说static的副做用是不会被垃圾回收。应该不会被回收的是 me 变量而且非 new 出来的实例。
PS:这种区分是和硬件有关系的,LZ大可不必深究。之后为了方便程序管理又将动态区划分为栈(stack)和堆(heap)。PS:堆与栈的管理是由操作系统完成的,比直接编程实现效率略高。以Java来说,所有类型说明,包括类名、类变量(注意,只是类变量,不包含它指向的对象)、类方法、实例变量与实例方法的声明,这些都是存放在静态区(即持久区)。
所有的实例都是存放在堆里的。
至于LZ给出的me变量所指的实例,由于存在的时间很长,所以应该是放在所谓的“年老代”里的吧。
我理解是栈也是放在jvm中的,但在jvm的哪个区域呢,那么栈是放在哪个区域呢?@suwei2002
想理解这个问题是为了在java程序跑得更稳定
@zxhcloth 我查过相关的文献,这个me应该是放在持久代的。