运行时数据区与JVM内存模型

一、运行时数据区

在装载阶段的第(2),(3)步可以发现有运行时数据,堆,方法区等名词

(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

(3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口 。说白了就是类文件被类装载器装载进来之后,类中的内容(比如变量,常量,方法,对象等这些数据得 要有个去处,也就是要存储起来,存储的位置肯定是在JVM中有对应的空间)

1.1 图解

在这里插入图片描述

1.2 初步认识
1.2.1 Method Area(方法区)
  1. 方法区是各个线程共享的内存区域,在虚拟机启动时创建
  2. 虽然JVM规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的是与Java堆区分开
  3. 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
  4. 当方法区无法满足内存分配需求时,抛出OutOfMemoryError异常

在这里插入图片描述

1.3.2 Heap(堆)
  1. Java堆是JVM管理内存中最大的一块,在虚拟机启动时创建,被所有线程共享
  2. Java对象实例以及数组都在堆上分配

在这里插入图片描述

1.3.3 JVM Stacks(虚拟机栈)
  1. 虚拟机栈是一个线程执行的区域,保存着一个线程中方法的调用状态一个Java线程的运行状态,由一个虚拟机栈来保存,所以虚拟机栈是线程私有的
  2. 每一个被线程执行的方法,为该栈中的栈帧,即每个方法对应一个栈帧调入一个方法,就会向栈中压入一个一个栈帧;一个方法调用完成,就会把该栈帧从栈中弹出
  • 图解栈和栈帧
void a(){
    b(); 
}
void b(){ 
    c(); 
}
void c(){
}

在这里插入图片描述

  • 栈帧

栈帧:每个栈帧对应一个被调用的方法,可以理解为一个方法的运行空间

每个栈帧包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向运行时常量池的引用、方法返回地址(Return Address)和附加信息

在这里插入图片描述

局部变量表:方法中定义的局部变量以及方法的参数存放在这张表中

操作数栈:以压栈和出栈的方式存储操作数的

动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接

方法返回地址:当一个方法开始执行后,只有两种方式可以退出,一种是遇到方法返回的字节码指令;一种是遇 见异常,并且这个异常没有在方法体内得到处理

1.3.4 程序计数器

​ 程序计数器,记录线程执行到的位置;如果线程正在执行Java方法,则记录正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,则这个计数器为空

1.3.5 本地方法栈

如果当前线程执行的方法是Native类型的,这些方法就会在本地方法栈中执行

1.4 折腾一下
1.4.1 栈指向堆

如果在栈帧中有一个变量,类型为引用类型,比如Object obj = new Object(),这就是典型的栈中元素指向堆中的对象

1.4.2 方法区指向堆

方法区中会存放静态变量、常量等数据。比如private static Object obj=new Object(),就是典型的方法区中元素指向堆中的对象

1.4.3 堆指向方法区

在这里插入图片描述

1.4.4 Java对象内存模型

一个Java对象在内存中包含3个部分:对象头、实例数据和对齐填充

在这里插入图片描述

二、 JVM内存模型

2.1 与运行时数据区
  • 堆和方法区是线程共享的
  • 虚拟机栈、本地方法栈、程序计数器都是线程私有的

可以换句话来说,JVM运行时数据区是一种规范,而JVM内存模式是对该规范的实现

2.2 图形展示

在这里插入图片描述

2.3 对象创建过程

新创建的对象会被分配到Eden区,一些特殊的大的对象会被直接分配到Old区

我是一个普通的Java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的。

在这里插入图片描述

2.4 常见问题
  • 如何理解Minor/Major/Full GC

Minor GC:回收全部新生代

Major GC:回收全部老年代

Full GC:回收全部

  • 为什么需要Survivor区?只要Eden区不行吗?

Survivor存在的意义是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代

  • 为什么需要两个Survivor区?

是为了解决碎片化,永远有一个Survivor space是空的,另一个非空的Survivor space无碎片

  • 新生代中Eden:S1:S2为什么是8:1:1?

新时代中有98%的对象都会被回收,只会剩下2%,所以使用10%的内存作为Survivor是绰绰有余的

  • 堆内存中都是线程共享的区域吗?

不是,JVM会默认为每个线程在Eden上开辟一个buffer区域,用来加速对象的分配,称之为TLAB,对象会优先在TLAB上分配,但是TLAB空间通常会比较小,如果对象比较大,那么还是会在共享区域分配

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
JVM内存模型Java虚拟机在运行时所使用的内存分配和管理方式。它包括了运行时数据,也就是JVM在内存中划分的不同域,用来存储程序的数据和指令。 JVM运行时数据主要包括以下几个部分: 1. 堆(Heap):用于存储对象实例和数组。堆是线程共享的域,所有线程共同使用堆来创建和访问对象。 2. 方法(Method Area):用于存储已加载的类信息、常量、静态变量和编译后的代码等。方法也是线程共享的域,它在内存中占用一块连续的空间。 3. 虚拟机栈(VM Stack):每个线程在创建时都会分配一个虚拟机栈,用来存储局部变量和方法调用信息。虚拟机栈是线程私有的,每个线程都有自己独立的虚拟机栈。 4. 本地方法栈(Native Method Stack):与虚拟机栈类似,用于存储本地方法调用的相关信息。 5. 程序计数器(Program Counter Register):用于存储当前线程执行的字节码指令的地址。 这些不同的运行时数据JVM内存模型中起着不同的作用,可以提供给程序运行所需的各种资源和环境。例如,堆用于存储对象实例,方法用于存储类信息和静态变量,虚拟机栈用于存储方法的局部变量和方法调用信息等。 总的来说,JVM内存模型运行时数据Java虚拟机在运行时所使用的内存管理和分配方式。它们的不同域有不同的作用,用来存储程序的数据和指令。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [运行时数据JVM内存模型](https://blog.csdn.net/weixin_45659364/article/details/124027073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [JVM:Java内存模型运行时数据域](https://blog.csdn.net/m0_71777195/article/details/131655107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java内存模型JVM运行时数据别详解](https://download.csdn.net/download/weixin_38648037/12745990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单手提煤气罐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值