java内存区域详解

简述

  java内存区域又称java运行时数据区域,这里注意它和JMM(java内存模型)是不同的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式。

运行时数据区域的划分

  运行时数据区域分为:方法区、堆、虚拟机栈、本地方法栈、程序计数器。

  前两个是多线程共享的内存区域,后三个是每个线程私有的。

程序计数器

  程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,在多线程状态下,一个cpu内核只会执行一条线程中的指令,因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。

  如果线程正在执行一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。

  如果执行的是本地(native)方法,这个计数器的值应该为空。

虚拟机栈

  虚拟机栈是用来描述java方法执行的线程内存模型:每个方法被执行的时候,java虚拟机栈就会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每个方法被调用至执行完毕的过程,就对应这一个栈帧在虚拟机栈中从入栈到出栈的过程。

本地方法栈

  虚拟机栈为虚拟机执行java方法服务,而本地方法栈是为虚拟机使用到的本地方法服务。

  值得一提的是Hot-Spot虚拟机直接把本地方法栈和虚拟机栈二合一。

Java堆

  java堆是JVM内存管理中最大的一块,它是被所有线程共享的一块内存。此内存区域的唯一目的就是存放对象实例,几乎所有的对象

实例都在这里分配内存。它同时也是垃圾收集器管理的主要区域,从内存回收的角度来看,由于现在收集器基本都采用分代收集算法,所

以 Java 堆中还可以细分为:新生代和老年代,以及更多更细分的永久代、Eden等等。

方法区

  方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

  JDK8 之前,Hotspot 中方法区的实现是永久代(Perm),JDK8 开始使用元空间(Metaspace)以前永久代所有内容的字符串常量移至堆内存,其他内容移至元空间,元空间直接在本地内存分配。

一点一点积累,一点一点蜕变!
原文地址:https://www.cnblogs.com/qq2210446939/p/14927691.html