认识JVM的内存模型

从上一节了解到整个JVM大的内存区域,分为线程共享的heap(堆),MethodArea(方法区),和线程独享的 The pc Register(程序计数器)、Java Virtual Machine Stacks(Java虚拟机栈)、Native Method Stacks(本地方法栈),如下图
image.png
同时也大概了解到各个内存区域主要存储的数据类型,根据之前的了解,明白了作为开发者要关注的是堆、方法区和Java虚拟机栈,先从Java虚拟机栈开始

Java虚拟机栈

Java虚拟机栈是线程独享的一个栈结构,遵循先进后出的原则,栈中存放着一个一个栈帧,每个栈帧代表着一个方法的调用,或者说,每调用一个方法,就向该线程的虚拟机栈中压入一个栈帧,当方法执行完成就弹出,栈帧中存放着对应的方法执行的数据
image.png

栈帧

如上图所示,每个栈帧中存放着以下数据

  1. 局部变量表 Array数组,存放着方法内的变量
  2. 操作数栈 栈结构,存放着操作数栈和中间计算结果,比如方法中代码int a=3,数值3就是操作数
  3. 动态链接 一种用于实现运行时动态绑定的机制,主要是指在运行时确定引用方法的实际方法体,用于实现多态和动态绑定
  4. 返回地址 当前方法执行结束后调用者的执行位置

通过代码和反编译代码理解Java虚拟机栈和栈帧

了解栈之后,需要明确一个事情,栈帧中局部变量表里的局部变量如果是引用类型,它实际存储的是内存地址,指向对应的堆中的对象
如下一段代码:

public class Person {public static int a = 100;public int b = 90;public static Object obj1 = new Object();public static int add(int i, int j) {Object obj2 = new Object();int k = 80;int result = i + j;return result;}public static void main(String[] args) {add(100,200);System.out.println("method add done");}
}
// 反编译后的指令码 只展示add方法
public static int add(int, int);Code:0: bipush        80 	//把数值80压入操作数栈的栈顶,供后续的运算或方法调用使用2: istore_2		   	//将操作数栈顶的整数值存储到局部变量表索引为2的位置3: iload_0			//从局部变量0中装载一个int类型值到操作数栈中4: iload_1			//加载位于局部变量表第2个位置的int类型变量5: iadd				//将两个栈顶的整数相加,然后将相加的结果压入栈顶6: istore_3			//将栈顶的整数存储到局部变量3中7: iload_3			//将第3个局部变量槽中的整型值加载到操作数栈的栈顶8: ireturn			//当前方法将执行完毕,并将栈顶的整数作为方法的返回值返回给调用者

根据上面代码,画出他在虚拟机栈中的存储
image.png
由上图也可以看出方法区和堆有互相引用
方法区中会存储静态变量,常量等信息,上面代码中public static Object obj1 = new Object();obj1存放在方法区中,对应的对象在堆中,就是方法区指向堆
对象头中记录的信息包含着指向对象对应的类元数据的内存地址,即堆指向了方法区

对象的内存布局

一个Java对象在内存中包括三个部分:对象头、示例数据和对齐填充
image.png

内存模型

根据以上信息引入Java虚拟机内存模型
主要是堆和非堆

堆分为Yong区和Old区

Yong区

Yong区又分为Eden,S0和S1,或者将S0和S1成为from和to,主要是为了垃圾回收

Old区
对象在内存中存储的变化
  1. 首先创建对象会分配在Eden区
  2. Eden区满,发生YongGC,扔存活的对象会放进S0,S0空间不足则直接放进Old区
  3. Eden区再次满,再次YongGC,多次YongGC使得对象年龄超过15的放进Old区或当S区中某一年龄以上的对象占用到S区一半时,将该年龄和以上的所有对象放进Old区
  4. Old区满是发生MajorGC,发生MajorGC时一般都伴随着YongGC,所以一般发生的是FullGC
  5. 当FullGC后仍无法存放时就会抛出OOM

非堆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/64526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调用chat-gpt

调用chat-gpt 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifact…

MVC,MVP,MVVM的理解和区别

MVC MVC &#xff0c;早期的开发架构&#xff0c;在安卓里&#xff0c;用res代表V&#xff0c;activity代表Controller层&#xff0c;Model层完成数据请求&#xff0c;更新操作&#xff0c;activity完成view的绑定&#xff0c;以及业务逻辑的编写&#xff0c;更新view&#xf…

Jenkins java8安装版本安装

一、首先准备Jenkins、Jdk8、Tomcat9安装包 根据Jenkins官网介绍&#xff0c;Jenkins支持Java8的版本如下&#xff1a; 我们选择2.164版本进行安装&#xff0c;根据版本号支持输入下载地址&#xff1a;https://archives.jenkins.io/war/2.164/jenkins.war&#xff0c;进行下载…

Mybatis 插入、修改、删除

前面几篇我们介绍了使用Mybatis查询数据&#xff0c;并且也了解了如何在Mybatis中使用JDK的日志系统打印日志&#xff1b;本篇我们继续介绍如何使用Mybatis完成数据的插入、修改和删除。 如果您对查询数据和Mybatis集成JDK日志系统不太了解&#xff0c;建议您先进行了解后再阅…

【Vue CLI】

node.js安装 https://nodejs.org/download/release/v15.14.0/ 管理员运行cmd node -v 安装npm npm install -g cnpm --registryhttps://registry.npm.taobao.org 查看是否安装成功 npm -v 注册淘宝镜像加速器 npm config set registry https://registry.npm.taobao.org/ 查看…

Vue2项目练手——通用后台管理项目第二节

Vue2项目练手——通用后台管理项目 路由限制重复跳转CommonAside.vue 顶部header组件搭建与样式修改右边用户菜单栏使用的组件图片CommonHeader.vue Vuex实现左侧折叠文件目录store/index.jsstore/tab.jsmain.jsCommonHeader.vueCommonAside.vueMain.vue 路由限制重复跳转 路由…

Qt使用Json

包含目录&#xff1a; #include <QJsonObject> #include <QJsonDocument> #include <QByteArray> #include <QFile> #include <QJsonArray>基本结构&#xff1a; 写json QJsonObject studentobj;QJsonArray arrarydata;QJsonObject subdata;…

后端面试话术集锦第 十四 篇:go语言面试话术

这是后端面试集锦第十四篇博文——go语言面试话术❗❗❗ 1. go数组、切片、扩容 go的数组和切片都是用来存储相同类型的数据集合。 数组是存储固定大小的集合,且为值引用。 但切片是存储无固定大小的集合,且为引用类型。 切片有三个属性,分别为指向指针的数组array,数组…

50ETF期权开户平台(0门槛期权开户指南)

50ETF期权开户平台比较好的有&#xff1a;期权馆&#xff0c;期权科普馆&#xff0c;小熊期权&#xff0c;期权酱&#xff0c;财顺财经&#xff0c;财顺期权等&#xff0c;都是国内前十的期权分仓平台&#xff0c;下文为大家结算50ETF期权开户平台&#xff08;0门槛期权开户指南…

HTTP介绍:一文了解什么是HTTP

前言&#xff1a; 在当今数字时代&#xff0c;互联网已经成为人们生活中不可或缺的一部分。无论是浏览网页、发送电子邮件还是在线购物&#xff0c;我们都离不开超文本传输协议&#xff08;HTTP&#xff09;。HTTP作为一种通信协议&#xff0c;扮演着连接客户端和服务器的重要角…

微信小程序新版隐私协议弹窗实现最新版

1. 微信小程序又双叒叕更新了 2023.08.22更新&#xff1a; 以下指南中涉及的 getPrivacySetting、onNeedPrivacyAuthorization、requirePrivacyAuthorize 等接口目前可以正常接入调试。调试说明&#xff1a; 在 2023年9月15号之前&#xff0c;在 app.json 中配置 __usePriva…

从docker容器访问宿主机

主要解决从容器内访问外网的服务。 网上文章的很大内容雷同&#xff0c;除了用–nethost这种硬来的可行外&#xff0c;其它的方法都没看的很懂&#xff0c;按自己的思路整理。 用–add-hosthost.docker.internal:host-gateway参数解决 docker run -d --add-hosthost.docker.i…

SpringCloudAlibaba Gateway(三)-整合Sentinel功能路由维度、API维度进行流控

Gateway整合Sentinel ​ 前面使用过Sentinel组件对服务提供者、服务消费者进行流控、限流等操作。除此之外&#xff0c;Sentinel还支持对Gateway、Zuul等主流网关进行限流。 ​ 自sentinel1.6.0版开始&#xff0c;Sentinel提供了Gateway的适配模块&#xff0c;能针对路由(rou…

kaggle赛后总结

1. 宽表 2.缺失值的处理方法 最简单粗暴的就是删除&#xff0c;这种情况是凡是有缺失值行数很少。均值替代。缺失值的行数比较多一点儿的时候&#xff0c;直接删除会影响样本数量&#xff0c;那就均值替代&#xff0c;或者中位数替代等方法。还有复杂的方法&#xff0c;把有缺…

机器学习笔记之最优化理论与方法(四) 凸函数:定义与基本性质

机器学习笔记之最优化理论与方法——再回首&#xff1a;凸函数定义与基本性质 引言凸函数的定义严格凸函数凸函数的推论&#xff1a;凹函数 常见凸函数凸函数的基本性质几种保持函数凸性的运算凸集与凸函数之间的关联关系 引言 本节将介绍凸函数定义及其基本性质。 本文是关于…

网络安全应急响应典型案例-(DDOS类、僵尸网络类、数据泄露类)

一、DDOS类事件典型案例 DDOS攻击&#xff0c;即分布式拒绝服务攻击&#xff0c;其目的在于使目标电脑的网络或系统资源耗尽&#xff0c;使服务暂时中断或停止&#xff0c;导致其正常用户无法访问。CC攻击使用代理服务器向受害服务器发送大量貌似合法的请求&#xff08;通常…

设计模式—简单工厂

目录 一、前言 二、简单工厂模式 1、计算器例子 2、优化后版本 3、结合面向对象进行优化&#xff08;封装&#xff09; 3.1、Operation运算类 3.2、客户端 4、利用面向对象三大特性&#xff08;继承和多态&#xff09; 4.1、Operation类 4.2、加法类 4.3、减法类 4…

【爬虫】7.1. JavaScript动态渲染界面爬取-Selenium

JavaScript动态渲染界面爬取-Selenium的简单学习 文章目录 JavaScript动态渲染界面爬取-Selenium的简单学习1. Selenium准备工作2. Selenium简单用法2.1. 初始化浏览器对象-webdriver.Chrome()2.2. 访问界面-browser.get()2.3. 查找节点-find_element()2.4. 节点交互-send_keys…

多线程练习-使用两个线程来累加 count 的值

题目 有20个线程&#xff0c;需要同时启动。 每个线程按0-19的序号打印&#xff0c;如第一个线程需要打印0 请设计代码&#xff0c;在main主线程中&#xff0c;等待所有子线程执行完后&#xff0c;再打印 ok 代码以及注释 public class Soultion {public static void main…

QUdpSocket Class

继承自 QAbstractSocket 类 QUdpSocket类提供UDP套接字。 UDP(用户数据报协议)是一种轻量级、不可靠、面向数据报、无连接的协议。它可以在可靠性不重要的情况下使用。QUdpSocket是QAbstractSocket的一个子类&#xff0c;它允许您发送和接收UDP数据报。 使用这个类最常见的方法…