jvm运行时内存是怎么分布的?(1)

  1. loadload屏障,对于这样的语句Load1; LoadLoad; Load2, 在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。

  2. storestore屏障,对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。

  3. loadstore屏障,对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。

  4. storeload屏障,对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。

Runtime Data Area and Instruction Set


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可以直接访问的内核空间的内存 (OS 管理的内存)

NIO , 提高效率,实现zero copy

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

image

每个线程都有自己的栈内存,里面存放的是栈帧,如果有调用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.

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

image

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

pubilc class Test1{

pubilc static void main(String [] args){

Test h = new Test();

h.m1();

}

}

pubilc class Test{

public void m1(){

int i = 200;

}

}

复制代码

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 17
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值