java中堆、栈和方法区的理解

百度上的答案太多,说的都比较抽象,请假大神们给我举例说明下
我自己的理解:
堆:存放对象、数组
栈:存放基础数据类型的对象和自定义对象的引用(不是对象)
方法区:存放class文件、常量、静态变量

 AppMain.java

 public   class  AppMain                

//运行时, jvm 把appmain的信息都放入方法区

{

public   static   void  main(String[] args)  //main 方法本身放入方法区。

{

Sample test1 = new  Sample( " 测试1 " );   //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面

Sample test2 = new  Sample( " 测试2 " );

test1.printName();

test2.printName();

}

} 
Sample.java

 public   class  Sample        //运行时, jvm 把appmain的信息都放入方法区

{

/** 范例名称 */

private  name;      //new Sample实例后, name 引用放入栈区里,  name 对象放入堆里

/** 构造方法 */

public  Sample(String name)

{

this .name = name;

}

/** 输出 */

public   void  printName()   //print方法本身放入 方法区里。

{

System.out.println(name);

}

} 

图片说明

栈,具体应该叫 方法调用栈

你理解的也没有问题只是不够全面。栈要分为虚拟机栈与本地方法栈。虚拟机栈:线程私有,生命周期与线程相同,描述的是Java方法执行的内存模型每一个方法执行的同时都会创建一个栈帧(Stack Frame),由于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法的执行就对应着栈帧在虚拟机栈中的入栈,出栈过程。本地方法站:作用是支撑Native方法的调用、执行和退出可能出现OutOfMemoryError异常和StackOverflowError异常有一些虚拟机(如HotSpot)将Java虚拟机栈和本地方法栈合并实现。
堆主要存放对象实例,在垃圾回收的时候有分为两个代,一个为新生代。一个老年代。其中老年带为经历过多次垃圾回收仍然存在的对象,新生代为没有经历过垃圾回收或者回收次数少的对象(如需了解可参见sun公司各收集器的机制)。
方法区就是存放class文件与类实现的内存空间。在HotSpot中也有永久带的叫法,但是在最新的据说要合并到堆中进行统一的垃圾回收管理。
希望我的回答能对你有帮助。想要 详细了解内存建议研读一下java虚拟机相关资料或者书籍

有一本 叫‘深入理解Java虚拟机 JVM高级特性与最佳实践‘的书讲的很全面,但是。。。我只能说。。我看一遍忘一遍仅仅了解个大概,楼主可以看看!!