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

前言-与正文无关

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

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

目录

栈、堆、方法区

栈和堆

堆和方法区

栈、堆、方法区和线程

存储内容

栈的特性

栈与请求

图解数据创建


栈、堆、方法区

栈内存中放哪些东西?
  ①基本类型的变量,例如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博客

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中文多模态InternVL-Chat-V1-5,中文理解能力强劲,8 项指标超越商业模型,性能媲美 GPT-4V

前言 近年来,多模态大型语言模型(MLLM)的快速发展,为人工智能在图像、文本等多模态信息理解和处理方面带来了前所未有的突破。然而,现有的主流多模态模型多以英文为训练语言,在中文理解和处理方面存在着明…

SwiftUI中Popover的使用(弹出方式,箭头位置,如何退出)

在iOS中,popover是出现在现有内容顶部的UI元素,通常用于在上下文中向用户呈现新视图。与其他占用整个屏幕的视图控制器不同,popover出现在一个较小的、集中的区域,从而使用户能够在必要时与popover外的应用程序的其他部分进行交互…

521源码-游戏源码-2024卡牌回合自走棋手游《梦间集》推出全新Linux手工服务端

首款稀有卡牌回合自走棋手游《梦间集》推出全新Linux手工服务端整理 更多网站源码,游戏源码,学习教程,请点击👉-521源码-👈获取最新资源 本游戏下载地址:2024卡牌回合自走棋手游《梦间集》推出全新Linux手…

算法(十三)回溯算法---N皇后问题

文章目录 算法概念经典例子 - N皇后问题什么是N皇后问题?实现思路 算法概念 回溯算法是类似枚举的深度优先搜索尝试过程,主要是再搜索尝试中寻找问题的解,当发生不满足求解条件时,就会”回溯“返回(也就是递归返回&am…

switch语句

作用 让顺序执行的代码,产生分支。 基本语法 switch(变量) {//变量 常量 执行 case和 break之间的代码case 常量:满足条件执行的代码逻辑;break;case 常量:满足条件执行的代码逻辑;break;//case 可以有无数个default://如果上面case的条件都不满足 就会执行 def…

sqlite--SQL语句进阶

SQL语句进阶 函数和聚合 函数: SQL 语句支持利用函数来处理数据, 函数一般是在数据上执行的, 它给数据的转换和处理提供了方便常用的文本处理函数: 常用的文本处理函数: // 返回字符串的长度 length();//将字符串…

【阿里云】在云服务器ECS 安装MySQL、本地远程连接或宝塔连接(手动部署)

目录 一、安装MySQL 二、配置MySQL 三、远程访问MySQL数据库 四、Navicat本地连接远程MySQL 五、宝塔连接MySQL 如果你是使用宝塔安装的MySQL请绕过,以下是通过命令行模式(手动部署)进行安装、配置及运行。 安装:MySQL8.0 …

C#WPF数字大屏项目实战02--主窗体布局

1、主窗体起始属性 设置有关属性如下: WindowStyle"None"-》无边框 AllowsTransparency"True" -》允许透明 WindowStartupLocation"CenterScreen"-》启动时位于屏幕中间 FontFamily"Microsoft YaHei"-》字体微软雅黑 …

更新mirh connect 内置derby数据库密码

更新mirh connect 内置derby数据库密码 1、下载derby连接客户端 https://archive.apache.org/dist/db/derby/ 选择任意版本即可,比如 https://archive.apache.org/dist/db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.zip 2、连接mirh文件数据库 1、把mi…

Linux主机安全可视化运维(免费方案)

本文介绍如何使用免费的主机安全软件,在自有机房或企业网络实现对Linux系统进行可视化“主机安全”管理。 一、适用对象 本文适用于个人或企业内的Linux服务器运维场景,实现免费、高效、可视化的主机安全管理。提前发现主机存在的安全风险,全方位实时监控主机运行时入侵事…

单片机原理及应用复习

单片机原理及应用 第二章 在AT89S52单片机中,如果采用6MHz晶振,一个机器周期为 2us 。 时钟周期Tocs1focs 机器周期 Tcy12focs 指令周期:一条指令所用的时间,单字和双字节指令一般为单机器周期和双机器周期。 AT89S5…

深色系的B端界面,特定场景非常适合。

深色系B端界面有以下几个好处: 提供更好的可读性:深色背景可以提供更高的对比度,使文字和图标更加清晰易读,尤其在低光环境下或者长时间使用的情况下,可以减少眼睛的疲劳。强调重要内容:深色背景可以使重要…

第 11 章 排序

第 11 章 排序 Abstract 排序犹如一把将混乱变为秩序的魔法钥匙,使我们能以更高效的方式理解与处理数据。 无论是简单的升序,还是复杂的分类排列,排序都向我们展示了数据的和谐美感。 本章内容 11.1 排序算法11.2 选择排序11.3 冒…

EitbaseEX香港业务开展,提升用户友好交易体验

在全球范围内备受瞩目的加密货币交易平台Coinbase,宣布正式入驻香港市场,并命名为EitbaseEX。这一战略性扩展举措,旨在为香港提供先进的加密货币交易技术和服务,同时将香港打造为其在亚太地区的重要枢纽。 作为国际金融中心&#…

基于云服务器使用DreamBooth训练主体

资源整理 参考教程:StableDiffusion/NAI DreamBooth自训练全教程 - 知乎 (zhihu.com) 云服务器平台:AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL 镜像链接:CrazyBoyM/dreambooth-for-diffusion/dreambooth-for-diffusion、 代码仓…

[Linux]vsftp配置大全---超完整版

[Linux]vsftp配置大全---超完整版 以下文章介绍Liunx 环境下vsftpd的三种实现方法 一、前言 Vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器,目前已经被许多大型站点所采用,如ftp.redhat.com,ftp.kde.org,ftp.gnome.org.等。…

Ubuntu20.04 Mysql基本操作知识

#Mysql基本知识 运行环境Ubuntu20.04 1.开启mysql服务 sytemctl start mysql不然,命令行进入myql交互行提交命令后,就会出现4200错误。 2.显示所有数据库 SHOW DATABASES;注意复数s,毕竟很多数据库 3.新建数据库test CREATE DATABASE …

推理和行动协同(Reason and Act,ReAct)和代码生成

文心一言 当我们将“推理和行动协同(Reason and Act,ReAct)”的概念应用于代码生成时,我们可以理解为一种指导原则或方法论,它强调了在代码生成过程中进行深思熟虑的决策(Reason)和有效执行&am…

Python | Leetcode Python题解之第123题买卖股票的最佳时机III

题目: 题解: class Solution:def maxProfit(self, prices: List[int]) -> int:n len(prices)buy1 buy2 -prices[0]sell1 sell2 0for i in range(1, n):buy1 max(buy1, -prices[i])sell1 max(sell1, buy1 prices[i])buy2 max(buy2, sell1 - …

C#WPF数字大屏项目实战01--开发环境与项目创建

1、学习目标 -界面布局 ,- 模板调整,- 控件封装,- 图表,- 通信对接,- 动态更新 2、开发环境 开发工具:Visual Studio-2022-17.8.6-Community 运行时框架:.Net 6或Framework 4.5以上 UI框…