众所周知,java内存模型主要说就是运行时数据区域。它主要包含程序计数器、堆、方法区、本地方法栈、虚拟机栈。接下来我们来详细 说说这几个区域。
运行时数据区域
每个JDK版本不同,运行时数据区也有所变化,JDK1.6及1.6以下的运行时常量池在方法区。
JDK1.7的运行时常量池在堆中,而JDK1.8则把方法区这个去掉,变成元空间。这个元空间不属于运行时数据区。下图为1.6的,本文没有特别说明都指的JDK1.6的内存模型

堆 几乎所有的对象都分配在这里,为什么要说几乎所有对象呢?后面会讲到,大家先思考下对象还有可能在什么地方。 java堆中还涉及到内存的分配以及垃圾回收。

虚拟机栈:
每个线程私有的,线程在运行中,每执行一个方法都会打包成一个栈帧,栈帧存储了局部变量表、操作栈、动态链接、出口等等信息,然后压入栈。每个时刻正在执行的当前方法就是虚拟机栈栈顶的栈帧。方法的执行就对应着栈帧在虚拟机栈的入栈和 出栈的操作。
对象可以在栈上分配,大家有想到吗?为什么?
因为线程是私有的,跟着函数的调用和销毁执行销毁,而不用使用GC,可以提高性能。
到底是什么样的对象才可以在栈上分配条件呢?
答案是需要逃逸分析
方法区:用于存储已经被虚拟机加载的类信息,常量("zdy","123"等),静态变量(static变量)等数据。
本地方法栈:本地方法栈保存的是native方法的信息,当一个JVM创建的线程调用native方法后,JVM不再为 其在虚拟机栈中创建栈帧,JVM只是简单地动态链接 并直接调用native方法
第一次写,其实有很多想表达的,而且更细腻,但是不会排版,导致我很多想写的没写出来,后续我熟悉之后会继续更新。