写点什么

jvm 运行时内存是怎么分布的?,java 多线程编程技术第二版下载

作者:Java高工P7
  • 2021 年 11 月 10 日
  • 本文字数:1898 字

    阅读完需:约 6 分钟

jvms 2.4 2.5


指令集分类




  1. 基于寄存器的指令集

  2. 基于栈的指令集 Hotspot 中的 Local Variable Table = JVM 中的寄存器


Runtime Data Area



PC 程序计数器 Program Counter

Each Java Virtual Machine thread has its own pc (program counter) register.


每个 Java 虚拟机线程都有自己的程序计数器的存储空间。


At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method for that thread.


在任何时候,每个 Java 虚拟机线程都在执行单个方法的代码,即该线程的当前方法。


If that method is not native , the pc register contains the address of the Java Virtual Machine instruction currently being executed.


如果该方法不是本机方法,则 pc 寄存器包含当前正在执行的 Java 虚拟机指令的地址。


存放指令位置


虚拟机的运行,类似于这样的循环:


取 PC 中的位置,找到对应位置的指令;


执行该指令;


PC ++;


复制代码


JVM Stack


Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread.


每个 Java 虚拟机线程都有一个私有 Java 虚拟机堆栈,与该线程同时创建。


A Java Virtual Machine stack stores frames


每个 Java 虚拟机存储的都是栈帧


  1. Frame - 每个方法对应一个栈帧

  2. Local Variable Table 局部变量

  3. Operand Stack 操作数堆 当一个方法刚刚开始执行时,其操作数栈是空的,随着方法执行和字节码指令的执行,会从局部变量表或对象实例的字段中复制常量或变量写入到操作数栈,再随着计算的进行将栈中元素出栈到局部变量表或者返回给方法调用者,也就是出栈/入栈操作。一个完整的方法执行期间往往包含多个这样出栈/入栈的过程。

  4. Dynamic Linking 动态链接 所谓动态链接就是指向运行时常量池的那个链接,然后看看指向的那个链接有没有解析,如果已经解析直接拿过来使用,没有解析尝试进行解析。表明这个方式叫什么,什么类型等等信息。比如在 a()方法中调用了一个 b()方法,在 a 的应用肯定有个 b()但是 b 的具体内容在哪里是 dynamic linking 去获取。

  5. return address a() -> b(),方法 a 调用了方法 b, b 方法的返回值放在什么地方


Heap


The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads.


java 虚拟机有个所有线程共享的堆内存。


The heap is the run-time data area from which memory for all class instances and arrays is allocated.


堆是运行时数据区,从中分配所有类实例和数组的内存。


Method Area


The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads.


Java 虚拟机具有一个在所有 Java 虚拟机线程之间共享的方法区域。


It stores per-class structures


存储每个类的结构


  1. Perm Space (<1.8) 字符串常量位于 PermSpace FGC 不会清理 大小启动的时候指定,不能变

  2. Meta Space (>=1.8) 字符串常量位于堆 会触发 FGC 清理 不设定的话,最大就是物理内存

Runtime Constant Pool

A run-time constant pool is a per-class or per-interface run-time representation of the constant_ pool table ina class file

Native Method Stack

An implementation of the Java Virtual Machine may use conventional stacks called native method stacks

Direct Memory

JVM 可


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


以直接访问的内核空间的内存 (OS 管理的内存)


NIO , 提高效率,实现 zero copy


上面的内容总结起来就是下面这张图



每个线程都有自己的栈内存,里面存放的是栈帧,如果有调用 native 方法就还存在 native method stack,还有自己 program counter 程序计数器,用来记录每条指令的执行,当 CPU 切换线程的时候方便知道之前线程执行到哪条指令,所有线程共享堆内存和方法区,方法区有两种实现,在 jdk8 之前方法区叫 PermGen 永久代,jdk8 及其以后的版本都叫 Meta Space 元数据区。


栈帧:A frame is used to store data and partial results, as well as to perform dynamic linking, return values for methods, and dispatch exceptions.


栈帧是用来存储数据部分结果,和执行动态链接,返回方法的值和处理异常调度。



我们看一下一个简单的方法的执行过程的栈帧是怎么样的。


pubilc class Test1{


pubilc static void main(String [] args){


Test h = new Test();


h.m1();


}


}


pubilc class Test{


public void m1(){


int i = 200;


}


}


复制代码


编译后的 Test1 字节码为:


0 new #2 <com/yhx/Test>


3 dup


4 invokespcial #3<com/yhx/Test>


7 istore_1


8 iload_1


9 invokespcial #3<com/yhx/Test>


12 return

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
jvm运行时内存是怎么分布的?,java多线程编程技术第二版下载