JVM内存结构解析

1 JVM体系结构

Jvm 简介

Java Virtual Machine 
有自己指令集  运行时内存区域
JVM只能运行.class文件  Scala也可以由JVM编译执行

JC日志

解决Java崩溃
内存溢出等

1.1 JVM 分为三个子系统

1.1.1 类加载子系统

在这里插入图片描述

1 加载
	将.calss从磁盘读到内存
2.链接
	2.1 验证 : 验证字节码文件正确
	2.2 准备 给类的静态变量分配内存 赋予默认值
	2.3 解析 装入类里面用到的类(静态链接)
3 初始化
	类的静态变量赋予值, 上述准备阶段为静态变量赋予的是虚拟机默认的初始值 ,此处赋予的才是java写的真正的初始值 执行静态代码块

在这里插入图片描述

1.1.2 运行时数据区(内存结构)
1.1.3 执行引擎

2 程序计数器

作用:保存当前执行指令的地址,一旦指令执行,更新到吓一条指令

3 虚拟机栈

可以理解为线程的内存空间 私有的
每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
每个线程只能有一个栈帧,对应当前正在执行的那个方法

3.2 栈帧

  • 局部变量表
存放局部变量的列表

一个局部变量可以保存类型为boolean、byte、char、short、float、reference、returnAddress的数据
两个局部变量可以保存一个类型为long和double的数据

局部变量使用索引来进行定位,第一个局部变量的索引值为0
  • 操作数栈
线程实际的操作台

后进先出的栈
当一个方法开始执行,数栈是空的,随着方法执行和字节码指令的执行
会从局部变量表或对象对象实例的地段中复制常量或变量写入到操作数栈,再随着计算的进行将栈中的元素出栈到局部变量表
或者返回给方法的调用者,也就是出栈
一个完整的方法执行期间包含多个入栈出栈操作
  • 动态链接
指向运行时常量池的引用

在class文件里卖弄,描述了一个方法调用了其他方法,或者访问成员变量是通过符号引用过来的
动态链接的作用就是将这些符号引用所表示的方法转换为实际方法的直接引用
  • 方法返回地址
包括正常返回和异常返回

无论何种方式,推出后都需要返回到方法被调用的位置,程序才能继续执行,方法返回时可能在当前栈帧中保存一些信息,用来恢复上层方法执行状态

3.3栈内存的溢出

  • 栈帧过大
  • 栈帧过多
-Xss size 调整栈内存大小

4 本地方法栈

被native修饰的方法

本地方法栈的功能特点类似于虚拟机栈,也是线程私有的
不同点:本地方法栈服务的对象是JVM执行的native方法,虚拟机栈服务的是JVM的Java方法
堆的区域是用来存放对象实例的,也是垃圾收集器管理的主要区域

5 堆 Heap

堆是JVM内存最大的一块
存放内存的区域,所有线程共享的一块区域 在JVM启动时建立

存放对象实例的内存区域 也是垃圾收集器管理的主要区域

堆在逻辑上分为:
	1 新生代
		Eden
		ServiviorFrom
		ServivorTo
	2 老年代
	

5.2 堆内存回收

6 方法区

在这里插入图片描述
作用:存储每个类的作用

运行时常量池 字段和方法数据 
方法和构造函数的代码
用于类和实例的初始化以及接口初始化的特殊方法

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JVM8的内存结构图如下所示:\[1\] - 程序计数器 - 虚拟机栈(JVM Stack) - 本地方法栈 - 元空间(MetaSpace) - Java堆(Heap) 其中,程序计数器用于记录当前线程执行的字节码指令的地址;虚拟机栈用于存储方法调用的局部变量、操作数栈、动态链接、方法出口等信息;本地方法栈用于支持本地方法的调用;元空间用于存储类的元数据信息,取代了JDK1.8之前的永久代(PermGen);Java堆用于存储对象实例和数组。 此外,JVM8还有直接内存,它是独立于JVM内存之外的内存,可以直接和NIO接口交互,提升了程序性能。\[2\] 在Java内存中,内存需要划分成新生代和老年代。新生代又分为eden、from和to三块区域,默认比例是8:1:1。每次创建对象时,对象会先存储到eden区域,当eden区域满了后,会触发minor GC回收该区域,未回收的对象会放入from或to区域。每经过一次GC,from和to两块空间的对象会进行一次移动,未回收的对象年龄也会增加1。当对象年龄达到一定阈值(默认为15岁),就会被晋升到老年代。当老年代满了时,会触发Full GC回收。如果堆内存不足,就会出现OutOfMemoryError。可以通过配置JVM参数(如-Xmx)来设置最大堆内存大小。\[3\] #### 引用[.reference_title] - *1* [JVM内存结构详解](https://blog.csdn.net/weixin_42173451/article/details/105805231)[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^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [最简单的JVM内存结构图](https://blog.csdn.net/duyabc/article/details/114679595)[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^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

oifengo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值