日期:2014-05-20  浏览次数:20771 次

数据去了堆的哪个块
示例代码

Class MyEntity{
      static MyEntity= new MyEntity()
}

我们知道堆内存的:年轻代,年老代,持久代
当jvm启动的时候我想知道上面的代码,产生了哪些数据,这些数据去了堆内存的那一块。
先说说我的理解,希望说得不对的地方大侠们能指出一下。
Class MyEntity 这个类信息被存在持久代了
static MyEntity 也被存在持久代了
new MyEntity()这个实例会存在哪里呢?我猜测也在持久代,但没有相关的文献证明。希望大家能帮忙解释一下。

------解决方案--------------------
你这代码有问题吧。(static MyEntity= new MyEntity())少申明了一个变量名
持久代是用来存放类信息的,new MyEntity()这是产生了一个实例,它是不会放到持久代的,从你的代码来看,它是存在年轻代。只有当年轻代空间不够,又无法回收可用空间时,它才会转移到老年代。
------解决方案--------------------
年轻代、年老代这些名词还真没听过,貌似是JVM为了区别不同的数据而自行管理的内存区域。

从本质上说,操作系统给每个程序分配的内存分两大块:一块是动态区,一块是静态区(Java中称为持久区)。
PS:这种区分是和硬件有关系的,LZ大可不必深究。之后为了方便程序管理又将动态区划分为栈(stack)和堆(heap)。PS:堆与栈的管理是由操作系统完成的,比直接编程实现效率略高。

以Java来说,所有类型说明,包括类名、类变量(注意,只是类变量,不包含它指向的对象)、类方法、实例变量与实例方法的声明,这些都是存放在静态区(即持久区)。
所有的实例都是存放在堆里的。
至于LZ给出的me变量所指的实例,由于存在的时间很长,所以应该是放在所谓的“年老代”里的吧。