Java中一个进程对映四块区域分别是:
  堆,堆栈,数据段,代码段
一般变量和引用是在堆栈中分配
对象是在堆中分配。我想问的是:对象不也是由变量和引用所组成吗?那按照上面所说,都放到堆栈中,那堆中放什么?
请大虾们详细帮我分析下Java内存的机制,有没有专门介绍内存的书?

解决方案 »

  1.   

    堆中放对象的实体,是用new的时候创建出来的,存的是构造方法实例化之后的实体
      

  2.   

    介绍java数据结构的书中应该有这个方面的描述的
      

  3.   

    方法中声明的变量分配于栈中,如果这个变量是一个引用类型,栈中它的位置存储的是一个指针,指向堆中的一个内存块的首地址,这个地址可能是0(此时变量引用的是null)。而这个堆中的内存块,就是jvm为对象分配的内存空间,里面含有各个方法的指针和成员变量,以及静态变量区地址、类型信息等。
    类的成员变量实际上是存在于堆中的。
      

  4.   

    谢谢大虾指点,还有几个疑问
    1.类的静态变量,字符数据池,这些数据放到哪?是放到数据段吗?
    2.类被加载加载到代码段吗?那么一旦类被加载后是不是一直存在于代码段,还是等CPU执行
    完就被清除,等到下次用时,再被载入,
    3.代码段使用来放程序的源代码吧,如果是,那代码段放多少源代码?
    4.cpu在处理写入文件的指令(入write())时,是如何处理的?cpu如何实现控制作用?
    5.变量名是写给人看的,那么计算机要找到这个变量是不是在内存中有个“变量名=地址”这种映射关系?
      

  5.   

    “jvm为对象分配的内存空间,里面含有各个方法的指针和成员变量”
     ”里面含有各个方法的指针“----------我想JVM不会为每个对象都复制方法代码到堆中,只有可能是创建对象时,加载了类,那么类中的成员方法就被放入内存,而这个方法的地址就被放在了该对象的堆中,疑问是:难道类被加载后一直存在于代码段内存中?这好像也不可能,请大虾指点。