image.png
    线程私有(堆、方法区)和线程共享(虚拟机栈、本地方法栈、程序计数器)

    JVM主要由类加载子系统、运行时数据区(内存结构)、执行引擎组成。

    image.png

    调优只能调优堆和方法区,本地方法栈和虚拟机栈以及程序计数器是JVM自动管理
    堆是存储单位(堆里存的都是内存地址),栈是运行空间
    方法区

    程序计数器:很小的一个内存空间存放了下一个将要执行的指令序号;代码按照这个顺序执行;
    每一个线程都一个自己的程序计数器;确保程序正确执行。

    栈帧:当前栈帧指的是正在执行的。

    native方法是java底层初期的c语言实现,调用早期的c方法。

    动态链接:在运行期间,由符号引用转化为直接引用

    常量池:存放的是一堆字符串;
    可以根据符号引用找到对应的实例对象

    方法出口/返回地址:可以根据这个存放的内存地址找到程序的调用者;

    image.png

    1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。

    2.Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用。

    3.本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的Native方法服务。

    4.Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。

    5.方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。

    6.运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。