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

image

对于一个在同一行的数据XY,会被同时加载进CPU,这个现象叫cache line缓存行对齐,  如果左边的CPU核心加载了X并进行修改,但是此时并没有将数据写回进主内存,或者是第三级缓存,此时右边的CPU核心将X读进,并修改,此时就会产生数据不一致的情况。对于左边修改了数据右边如何才能知道,这是硬件层级需要解决的。 多线程一致性的硬件支持有一下集中方式。

  1. 锁总线的方式。总线锁会锁住bus总线,使得其他CPU不能访问内存中的其他地址,因而效率极低。CPU的共享内存都是通过

image

  1. MESI(英特尔CPU) 等等之类的缓存一致性协议,相对于总线锁的方式MESI的性能好很多。

  2. M: 被修改(Modified) 当一个值被加载到一个CPU内存中,同时这个CPU修改了这个值,则用Modified来表示,以为着在未来某个时刻会将这个值写入进主存。

  3. E: 独享的(Exclusive) 只有当前的CPU才能加载这个数据,就属于Exclusive独享的值。

  4. S: 共享的(Shared) 当多个CPU读取了同一个值,则用Shared来表示。

  5. I: 无效的(Invalid) 当前CPU读取的值已经被修改过了,则这个值是无效的用Invalid表示,以为这未来某个时刻会从主存中读取这个值。

  6. 在特定情况下CPU会进行指令重排,以保证高效的执行。CPU如何保证特定的情况下不不乱序执行。通过内存屏障来保证指令的有序性。

下面是三种CPU指令内存屏障指令。

  1. sfence:在sfence指令前的写操作必须在sfence后写操作完成之前完成操作。即在两次写操作之间加个屏障使其不能被重排。

  2. lfence:在lfence指令前的读操作必须在lfence后的读操作完成之前完成操作。即在两次读操作之间加个屏障使其不能被重排。

  3. mfence:在mfence指令前的读写操作必须在mfence的读写操作完成之前完成操作。即在一次读一次写和另一次读和一次写之间加一个屏障使其不能被重排。

CPU保证有序执行除了可以使用mfence,还可以使用

jvm内存屏障,对上面的CPU内存屏障进行组合,有如下四种屏障

  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 管理的内存)

最后

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

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

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

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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值