百度上的答案太多,说的都比较抽象,请假大神们给我举例说明下
我自己的理解:
堆:存放对象、数组
栈:存放基础数据类型的对象和自定义对象的引用(不是对象)
方法区:存放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高级特性与最佳实践‘的书讲的很全面,但是。。。我只能说。。我看一遍忘一遍仅仅了解个大概,楼主可以看看!!