JVM中的内存主要分为5个区域,分别是方法区、堆内存、虚拟机栈、本地方法栈、程序计数器。
①方法区:是线程之间共享的区域,常量、静态变量、JIT编译后的代码都在方法区,主要用于存储虚拟机加载的类信息。也可以称为“永久代”,垃圾回收效果一般,通过-XX:MaxPermSize控制上限。
②堆内存:也是线程之间共享的区域,主要用来存储创建的对象实例,通过
-Xmx 设置最大堆内存
-Xms设置最小堆
-Xmn 设置新生代大小
新生代 = eden区 + 2 * Survivor区
③虚拟机栈(栈内存):栈内存中主要保存局部变量、基本数据类型变量以及堆内存中某个对象的引用变量。每个方法在执行的同时会创建一个栈帧,用来存储局部变量表、操作数栈、动态链接和方法出口等信息。栈中的栈帧随着方法的进入和退出有条不紊的执行着入栈和出栈的操作。
④程序计数器:程序计数器是当前线程执行的字节码的位置指示器,字节码解释工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,是内存区域中唯一一个在虚拟机规范中没有没有规范任何OutOfMemoryError情况的区域。
⑤本地方法栈:主要为JVM提供使用native方法的服务。
PS:以上JVM内存模型适用于Java1.8之前,Java1.8后有了些许变化。