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

解决方案 »

  1.   

    你这代码有问题吧。(static MyEntity= new MyEntity())少申明了一个变量名
    持久代是用来存放类信息的,new MyEntity()这是产生了一个实例,它是不会放到持久代的,从你的代码来看,它是存在年轻代。只有当年轻代空间不够,又无法回收可用空间时,它才会转移到老年代。
      

  2.   

    不好意思,最近写Python 写多了,写得快就忘了。应该是:
    static MyEntity  me = new MyEntity()
    请问me 也放在年老代了吗?
    new MyEntity() 应该是如你所说的那样,我的误解主要来自static 关键字,因为我记得曾经看过一些文章说static的副做用是不会被垃圾回收。应该不会被回收的是 me 变量而且非 new 出来的实例。
      

  3.   

    年轻代、年老代这些名词还真没听过,貌似是JVM为了区别不同的数据而自行管理的内存区域。从本质上说,操作系统给每个程序分配的内存分两大块:一块是动态区,一块是静态区(Java中称为持久区)。
    PS:这种区分是和硬件有关系的,LZ大可不必深究。之后为了方便程序管理又将动态区划分为栈(stack)和堆(heap)。PS:堆与栈的管理是由操作系统完成的,比直接编程实现效率略高。以Java来说,所有类型说明,包括类名、类变量(注意,只是类变量,不包含它指向的对象)、类方法、实例变量与实例方法的声明,这些都是存放在静态区(即持久区)。
    所有的实例都是存放在堆里的。
    至于LZ给出的me变量所指的实例,由于存在的时间很长,所以应该是放在所谓的“年老代”里的吧。
      

  4.   

    @ zxhcloth
    我理解是栈也是放在jvm中的,但在jvm的哪个区域呢,那么栈是放在哪个区域呢?@suwei2002
    想理解这个问题是为了在java程序跑得更稳定
      

  5.   

    栈就是栈,堆就是堆,他们两个都是jvm里独立的区域。
      

  6.   


    @zxhcloth 我查过相关的文献,这个me应该是放在持久代的。