Jvm(一)之栈、堆、方法区

news2024/11/16 3:47:50

前言-与正文无关

        生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步,感受周围的世界。让我们一起提醒自己,要适时放慢脚步,欣赏生活中的每一道风景,享受与家人朋友的温馨时光,发现那些平凡日子里隐藏的幸福时刻。因为,这些点点滴滴汇聚起来的,才是构成我们丰富多彩生活的本质。希望每个人都能在繁忙的生活中找到自己的快乐之源,不仅仅为了生存而工作,更为了更好的生活而生活.

        送你张美图!希望你开心!

目录

栈、堆、方法区

栈和堆

堆和方法区

栈、堆、方法区和线程

存储内容

栈的特性

栈与请求

图解数据创建


栈、堆、方法区

栈内存中放哪些东西?
  ①基本类型的变量,例如int a=3中的a;
  ②上图对象的引用变量,例如Person person=new Person();中的person


堆内存中存放哪些东西?
  ① 存放由new创建的对象和数组。如上图的new Person()后的对象:
  在堆中存放的内存,由Java虚拟机垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量持有的内容等于数组或者对象在堆内存中的首地址。在栈中的这个特殊的变量,就成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。


静态区/方法区(也叫元空间)存放哪些东西?:
  方法区(method)也叫做静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量,还有string的直接赋值的数据值。
  方法区中包含的都是在整个程序中永远唯一的元素,例如class,static变量。
  全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量放在相邻的另一块区域。

栈和堆

        通俗来讲,堆是用来存放对象的(在细说一下代码执行的new,包括new后set的内容,也就是对象所持内容都是堆存放。),而栈是用来执行程序还有对象引用的,方法区存放类,静态变量的。同一个栈中有3个部分是共享的:基本类型变量区,执行环境上下文,操作指令区。

        就速度来说,有如下关系: 寄存器 > 栈 >堆 >其他这是栈的优势。但缺点是,存在栈中的数据大小和生存期是必须确定的,缺乏灵活性。栈有一个很重要的特性,就是存在栈中的数据可以共享。假设我们同时定义:

        int a = 3;

        int b = 3;

        编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用时

堆和方法区

        注意一下String s3 = "china" 中china也存在方法区;String ss1 = new String("china"); 才存在堆中。对于通过 new 产生一个字符串(假设为 ”china” )时,会先去常量池中查找是否已经有了 ”china” 对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此 ”china” 对象的拷贝对象。并把ss1指向堆中的地址。(在常量池中创建目的是为了提升字符串的访问效率

栈、堆、方法区和线程

栈是私有,堆和元空间是公有

栈也叫栈内存,是在线程创建时创建,用于管理该线程的局部变量、方法调用信息、操作数栈等。它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,这些栈在物理内存中是独立的,互不干扰。8种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配 。每一个栈对应一个线程,但是栈的数量实在太多了,导致jvm无法容纳这么多的栈。虚拟机将抛出一个OutOfMemory 异常

每个线程在创建时都会分配一个独立的栈,

存储内容
  • 局部变量表:包含方法参数和局部变量。局部变量表的大小在编译时确定。

  • 操作数栈:用于执行字节码指令时存储操作数和中间结果。

  • 栈帧:每个方法调用都会创建一个栈帧,栈帧包含局部变量表、操作数栈、动态链接和方法返回地址。

  • 动态链接:用于支持方法调用的动态链接。

  • 方法返回地址:方法返回时需要跳转的地址。

栈的特性
  • 独立性:每个线程都有一个独立的栈,栈内数据不会与其他线程共享。

  • 内存大小:栈的大小可以通过 JVM 参数 -Xss 配置,通常在 512 KB 到 1 MB 之间。1.5以后默认1M.

  • 栈帧:每次方法调用都会创建一个新的栈帧,保存方法的局部变量、操作数栈、动态链接和返回地址。

  • 生命周期:栈的生命周期与线程相同,从线程创建到线程销毁。

栈与请求
  1. 请求到达服务器

    • 当一个新的 HTTP 请求到达服务器时,服务器会从线程池中获取一个可用线程(如果没有可用线程,可能会阻塞或拒绝请求,视线程池配置而定)。

  2. 线程处理请求

    • 获取到线程后,该线程会开始处理请求,包括解析请求头、处理业务逻辑、访问数据库、生成响应等。

    • 在这个过程中,线程会使用它的栈来保存方法调用的信息、局部变量和中间计算结果。

  3. 请求处理完成

    • 当请求处理完成后,线程会生成 HTTP 响应并返回给客户端。

    • 处理完成后,线程会返回到线程池中,等待下一个请求。

图解数据创建

package test01;
 
public class StackHeadMethod {
 
	public static void main(String[] args) {
 
		int a = 1;
		String b = "testBName";
		Test test = new Test();
		
		test.testMethod(a, b);
	}
}
 
class Test {
	
	private int testA;
	private String testB;
	private static final int testC = 2;
	
	public void testMethod(int testA, String testB){
		this.testA = testA;
		this.testB = testB;
	}
}

 首先,JVM将StackHeadMethod.class、Test.class装载到方法区(JVM会执行启动类装载器、扩展类装载器和类路径装载器,在此只详细讲解针对本测试代码的字节码文件的执行)。其中方法区中的2是Test.java中的静态变量,在类加载的时候就在方法区中的静态存储空间分配内存。

 然后,在StackHeadMethod.class文件中,找到main方法,开始执行main方法。将main方法在栈中开辟一个空间,称为栈帧。执行下面07、08、09、17、18、19行代码。   再然后,执行test.testMethod(a, b);这一行,在栈中新分配一个栈帧,调用test中的testMethod方法。

  最后,testMethod方法执行完之后,testMethod栈帧从栈中释放空间,然后main方法执行完之后,main栈帧也释放空间,最后堆中的对象和方法区中的静态变量、字符串和字节码指令都没被使用时,根据java虚拟机的垃圾回收机制,进行对垃圾的回收。
    以上,是执行一段代码,对内存进行开辟和释放的整个过程。

------------------------------------------与正文内容无关------------------------------------
 如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!

混口饭吃了!如果你需要Java 、Python毕设、商务合作、技术交流、就业指导、技术支持度过试用期。请在关注私信我,本人看到一定马上回复!

这是我全部文章所在目录,看看是否有你需要的,如果遇到觉得不对地方请留言,看到后我会查阅进行改正。

A乐神-CSDN博客

关注在文章左上角,作者信息处。

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

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

相关文章

【JMeter接口自动化】第2讲 Jmeter目录结构

JMeter的目录结构如下: bin目录:可执行文件目录,启动jmeter时,就是启动bin目录下的ApacheJmeter.jar,jmeter.bat,jmeter.sh ApacheJmeter.jar:启动文件 jmeter.bat:Windows 的启动命令。 jmeter…

数据库系统概念(第七周 第一堂)(E-R模型)

目录 前言 基本概念 观点与模型 作用与要求 E-R模型元素 实体(entity) 实体集(entity set) 属性(attribute) 域(domain) 码 (key) 联系 &#x…

12V升20V3.5A升压恒压WT3207

12V升20V3.5A升压恒压WT3207 WT3207是一款高效PWM升压控制器,采用SO-8封装设计,专为低输入电压应用优化。该控制器支持5V至36V的宽输入电压范围,使其能够有效提升12V、15V和19V系统的电压水平,特别适合于两节或三节锂离子电池供电…

kvm--安装启动

前期 使用vmware workstation 时 安装kvm yum install qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install -y systemctl enable --now libvirtd

【JAVA SE】多态

✨✨欢迎大家来到Celia的博客✨✨ 🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉 所属专栏:JAVA 个人主页:Celias blog~ 目录 引言 一、多态 1.1 多态的概念 1.2 多态的实现条件 1.3…

【码银送书第二十期】《游戏运营与出海实战:策略、方法与技巧》

市面上的游戏品种繁杂,琳琅满目,它们是如何在历史的长河中逐步演变成今天的模式的呢?接下来,我们先回顾游戏的发展史,然后按照时间轴来叙述游戏运营的兴起。 作者:艾小米 本文经机械工业出版社授权转载&a…

Vue前端平台的搭建

文章目录 前端平台搭建(`Vue2.6`,App:`HBulderX`)创建`Vue2.6`项目下载相应插件方便开发路由配置对连接后端进行一些配置(`main.js`文件)导入ElementUI组件[组件 | Element](https://element.eleme.cn/#/zh-CN/component/icon)同步与异步`axios`异步请求框架前端平台搭建(Vue2.…

零基础入门学习Python第二阶04SQL详解01

SQL 和 MySQL 详解 SQL 详解 我们通常可以将 SQL 分为四类,分别是 DDL(数据定义语言)、DML(数据操作语言)、DQL(数据查询语言)和 DCL(数据控制语言)。DDL 主要用于创建…

正则匹配优化:匹配排除多个字符串的其他字符串

(^entity|^with|...)\w优化 (?!entity|with|has|index|associations|input)\w(?!): 匹配排除项 效果 继续优化 匹配会过滤掉带有关键字的字段,在过滤的时候是可以加上尾部结束匹配符的 效果:

pytorch+YOLOv8-1

1.工具开发 2.idea配置pytorch环境 默认安装新版本torch pip install torch 3.pytorch验证 4. print(torch.cuda.is_available()) 输出结果为 False 说明我只能用cpu

Docker搭建FRP内网穿透服务器

使用Docker搭建一个frp内网穿透 在现代网络环境中,由于防火墙和NAT等原因,内网设备无法直接被外网访问。FRP (Fast Reverse Proxy) 是一款非常流行的内网穿透工具,它能够帮助我们将内网服务暴露给外网。本文将介绍如何在Linux服务器上使用Do…

Java——面向对象初阶

前言: Java面向对象相关讲解 文章目录 一、面向对象二、类与对象三、封装四、构造方法及重载五、this关键字六、基本数据类型和引用数据类型七、JavaBean类 一、面向对象 面向对象(Object-Oriented Programming, OOP)是一种编程范式&#xff…

HarmonyOS 鸿蒙DevEco:导入无法运行提示Sync failed

场景:导入官网下载的案例后导入发现无法运行模拟机,Notifications提示Sync failed... 解决:查看Cause发现是版本问题,通过修改相关内容来解决该问题 1、打开案例地址找到hvigor文件夹 2、打开hvigor-config.json5,将&…

BUUCTF--[VN2020 公开赛]warmup

一开始直接告诉你libc基址。 有沙盒,分析了一下,write的count不等于0x10就可以,0x30什么的都可以。 嗯,还开了PIE。 很明显了,orw。 问题是开了PIE,bflag\x00不能写在BSS上了,同时也不能重复执…

5.30 学习总

刷题记录(Codeforces Round 947 (Div. 1 Div. 2)B,C题)和Codeforces Round 948 (Div. 2)B题 一.B. 378QAQ and Mochas Array B. 378QAQ and Mochas Array time limit per test 1 second memory limit per test 256 megabytes in…

Android 11 Audio strategy配置解析

在启动AudioPolicyService时,通过EngineBase的loadAudioPolicyEngineConfig函数去解析strategy配置。其调用流程如下 接下来就对loadAudioPolicyEngineConfig展开分析 1,解析volume标签 engineConfig::ParsingResult EngineBase::loadAudioPolicyEngine…

构建 VPC 并启动 Web 服务器

实验 2:构建 VPC 并启动 Web 服务器 目标 完成本实验后,您可以: 创建 VPC。创建子网。配置安全组。在 VPC 中启动 EC2 实例。任务 1:创建 VPC 在本任务中,您将使用 VPC 向导在单个可用区中创建一个 VPC、一个互联网网关…

【vueCms】vueCms后台管理系统安装问题集合

开源项目地址: https://www.vuecms.cn/ 开源代码地址: https://gitee.com/derekgo/vue-cms_xg 问题一 如果出现提示少了个index.html。如下图 解决办法: 重新安装前端(vue3_vite)项目依赖 问题二 npm版本高无法解析依赖树导致依赖下载失败 解决方案: npm install --legacy…

Web程序设计-实验05 DOM与BOM编程

题目 【实验主题】 影视网站后台影视记录管理页设计 【实验任务】 1、浏览并分析多个网站后台的列表页面、编辑页面(详见参考资源,建议自行搜索更多后台页面)的主要元素构成和版面设计,借鉴并构思预期效果。 2、新建 index.h…

ODBC访问达梦数据库Ubuntu18.04 x86-x64(亲测有效)

ODBC访问达梦数据库Ubuntu18.04 x86-x64 第1步:安装unixodbc驱动,使用下面命令。第2步:拷贝已经安装好的达梦数据库驱动程序第3步:配置ODBC必要的参数文件,如下图第4步:设置环境变量第5步:连接测试 说明&am…