1.jvm 进程内存逻辑结构
主要分为三大块
1.堆
2.方法区
3.本地内存
2.jvm内存结构
程序计数器: 较小的内存空间, 当前线程执行的字节码的行号指示器(对java多线程起关键作用,多线程程序会不断切换线程,记录当前线程执行的行数,以便切回来的时候能继续执行);各线程之间独立存储,互不影响。
java栈: 线程私有,生命周期和线程,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程;栈里面存放着各种基本数据类型和对象的引用。栈帧解释如下图。
本地方法栈: 本地方法栈保存的 是native方法的信息,当一个 JVM创建的线程调用native方法 后,JVM不再为其在虚拟机栈中 创建栈帧,JVM只是简单地动态 链接并直接调用native方法。
堆:堆数据区是用来存放对象和数组(特殊的对象)。堆内存由多个线程共享。堆内存随着JVM启动而创建。(重点关注:涉及到 内存的分配(new关键字,反射 等)与回收(回收算法,收集器 等))
方法区:也叫永久区,用于存储已经被虚拟机加载的类信息,常量,静态变 量(static变量)等数据。
运行时常量池::运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。
本地内存:不是虚拟机运行时数据区的一部分,也不是 java虚拟机规范中定义的内 存域; 如果使用了NIO,这块区域 会被频繁使用,在java堆 内可以用directByteBuffer 对象直接引用并操作这块内存不受java堆大小限制,但受本机总内存的限制,可以通过MaxDirectMemorySize来设置(默认与堆内存最大值一样),所以也会出现 OOM异常。