讲一讲Java内存模型(持续更新)

参考:【Java千问】你了解Java内存结构么(Java7、8、9内存结构的区别)
1、运行时数据区
  首先Java源文件(.java)会被Java编译器编译为字节码文件(.class),然后由JVM中的类加载器(Class Loader)加载各个类的字节码文件,加载完毕后,交由JVM执行引擎(Execution Engine)执行。
  在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为运行时数据区(Runtime Data Area),也就是我们常说的JVM内存。因此,在Java中我们常常说到的内存管理就是针对这段(JVM)空间进行管理(分配和回收)。
2、JVM内存
分为:公有的Java堆、方法区,以及线程私有的程序计数器、本地方法栈,虚拟机栈五个部分。
2.1、程序计数器
线程私有,占用内存小,与线程同生命周期。
作用:字节码行号指示器。
2.2、虚拟机方法栈
线程私有,使用连续内存空间,与线程同生命周期。
作用:java方法执行的内存模型,存储局部变量表、操作栈、动态链接、方法出口等信息。
配置参数:-Xss
抛出异常:StackOverflowError、OutOfMemoryError
2.3、java堆
线程共享,可使用非连续内存地址。与JVM同生命周期。
作用:保存对象实例,所有对象实例(包括数组)在此分配。
配置参数:-Xms、-Xsx、-Xmn
抛出异常:OutOfMemoryError。
2.4、方法区
线程共享,可使用非连续内存地址,与JVM同生命周期。
作用:存储已被JVM加载的类信息、常亮、静态变量、即时编译器编译后的代码等数据。
配置参数:-XX:PermSize:16M、-XX:MaxPermiSIze:64M
抛出异常:OutOfMemoryError

2.5、运行时常量池
方法区的一部分,具有动态性。
作用:存放字面量(字面量含义可以看我另一篇文章:字面量的含义)及符号引用。

讲一讲Java内存模型(持续更新)