Java 内存是怎么分配的!除了栈,堆,还有什么啊!像那些代码是分配在那里的!比如
class Person
{ int a;
  static int b;  System.out.println();
}
请问 class Person System等等是怎么分配的啊

解决方案 »

  1.   

    动态加载,需要时从磁盘加载上来,new的时候分配一块空间。
      

  2.   

    栈区:存放局部变量和引用;如:变量a
    堆区:存放对象实例 new String("hello");
    全局变量区:存放全局变量如关键字static 你写的b变量;
    代码区:存放的是方法而已
      

  3.   

    Java内存分为五块:
    方法区、堆、本地方法栈、PC寄存器、JVM方法栈
    方法区:主要存放加载类需要的信息,如类名,修饰符,类中的静态变量,类中定义为final类型的常量,类中的field域信息,类中的方法信息,当我们用反射的时候,通过Class对象的getName()、isInterface()等获取信息的时候,所获信息皆来自于方法区。
    堆:用于存放对象实例及数组值,暂且可认为Java中所有通过new创建的对象都在堆中分配。
    本地方法栈:用于支持native方法的执行,但是在Sun JDK 中,本地方法栈和JVM方法栈是同一个。
    寄存器:寄存器占用的一般为CPU寄存器或者是操作系统内存,JVM方法栈一般占用系统内存,在上面分配内存非常高效。
    对照着我这个,你再看看你那个例子,内存怎么分配应该明白了吧?
    对于JVM的内存分配,以及Java的GC,二者有很大的关系,同时也是Java重中之重的内容,一段文字难以解释清楚,过一段时间,我会在我的博客上推出一篇专门研究JVM内存管理的文章,欢迎关注:
    http://blog.csdn.net/zhangerqing
      

  4.   

    person应该是在方法区中存储的,也有的书叫静态区
    堆中存放类的对象,栈中存放对象的引用和基本数据类型的数据
      

  5.   

    在JAVA中,有六个不同的地方可以存储数据:
    1. 寄存器(register)。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部
    。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,
    也不能在程序中感觉到寄存器存在的任何迹象。
    2. 堆栈(stack)。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。
    堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的
    分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的
    确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序
    的灵活性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其中。
    3. 堆(heap)。一种通用性的内存池(也存在于RAM中),用于存放所以的JAVA对象。堆不同于
    堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存
    活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,
    只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,
    为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。4. 静态存储(static storage)。这里的“静态”是指“在固定的位置”。
    静态存储里存放程序运行时一直存在的数据。
    你可用关键字static来标识一个对象的特定元素是静态的,
    但JAVA对象本身从来不会存放在静态存储空间里。
    5. 常量存储(constant storage)。常量值通常直接存放在程序代码内部,
    这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,
    常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中
    6. 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,
    在程序没有运行时也可以存在。
    为什么有些文章上面是这样说的啊!搞不懂