【JVM基础04】——组成-什么是虚拟机栈?

目录

  • 1- 引言:虚拟机栈
    • 1-1 虚拟机栈是什么?(What)
    • 1-2 为什么用虚拟机栈?虚拟机栈的作用 (Why)
  • 2- ⭐核心:栈的常见问题(How)
    • 2-1 方法内的局部变量是否线程安全?
        • 线程不安全的局部变量
    • 2-2 什么情况会导致栈内存溢出?
    • 2-3 栈和堆的区别?
  • 3- 小结:
    • 3-1 什么是虚拟机栈?
    • 3-2 垃圾回收是否涉及栈内存?
    • 3-3 栈内存分配越大越好吗?
    • 3-4 方法内的局部变量是否线程安全?
    • 3-5 什么情况会导致栈内存溢出?
    • 3-6 栈和堆的区别?


1- 引言:虚拟机栈

1-1 虚拟机栈是什么?(What)

  • 虚拟机栈是每个线程独有的: Java Virtual Machine Stacks (Java虚拟机栈),每个线程运行时候所需要的内存称为虚拟机栈,是先进后出的。栈内存也是线程安全的(因为其是每个线程独有的)。
    • 假设有栈帧来了,其会压入栈底,再有栈帧来了其会依次压入。
  • 栈帧: 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
  • 活动栈帧: 每个线程只能有一个活动栈帧,对应着当前正在执行的方法

image.pngimage.png

1-2 为什么用虚拟机栈?虚拟机栈的作用 (Why)

  1. 方法调用管理:
  • 每个方法调用都会在虚拟机栈中创建一个新的栈帧,栈帧中包含了方法的局部变量、操作数栈、动态链接和方法返回地址等信息。通过这种机制,虚拟机能够正确地执行方法调用和返回操作。
  1. 局部变量存储:
  • 方法中的局部变量会存储在对应的栈帧中。由于栈帧是线程私有的,因此局部变量是线程安全的。

2- ⭐核心:栈的常见问题(How)

2-1 方法内的局部变量是否线程安全?

线程内的局部变量是否线程安全,取决于该变量是否被多个线程共享使用
image.png
线程安全的局部变量

  • 在方法 m1 中,StringBuilder sb 是一个局部变量,仅在方法 m1 内部使用。由于每个线程调用 m1 时都会创建自己独立的 sb 变量,因此 m1 方法中的局部变量 sb 是线程安全的。
线程不安全的局部变量
  • 在方法 m2 中,StringBuilder sb 作为参数传递进来,可能会被多个线程同时访问。图中显示在 main 方法中,一个新线程会调用 m2 方法并传入 sb 变量。这种情况下,sb 变量被多个线程共享使用,因此 m2 方法中的局部变量 sb 是线程不安全的。
  • 在方法 m3 中,StringBuilder sb 虽然是在方法内部创建的局部变量,但方法返回了这个变量的引用。此时,外部方法(例如 main 方法)可以共享和修改这个返回的 sb 变量。如果多个线程调用 m3 方法并使用返回的 sb 变量,也会导致线程不安全。

结论

  • 线程安全:当局部变量在方法内部使用,并且没有逃离方法的作用范围,它是线程安全的。
  • 线程不安全:如果是局部变量引用了对象,并逃离方法的作用范围(当局部变量通过参数传递或者作为返回值返回),导致可能被多个线程共享使用,此时是线程不安全的。

2-2 什么情况会导致栈内存溢出?

① 栈帧过多导致栈内存溢出,典型的问题:递归调用
image.png
② 栈帧过大导致栈内存溢出

  • 局部变量过多:当一个方法中定义了过多的局部变量,每个局部变量都需要在栈中分配空间,导致栈帧过大。如果栈帧大小超过了虚拟机栈的最大限制,将会导致栈内存溢出。
  • 大对象的局部变量:如果方法中包含大对象作为局部变量,这些对象会占用大量的栈空间,导致栈帧过大,进而可能导致栈内存溢出。

2-3 栈和堆的区别?

①用途和存储内容不同

  • 栈内存:用于存储局部变量和方法调用。每当一个方法被调用时,都会在栈中创建一个新的栈帧,用于存储该方法的局部变量、操作数栈、动态链接和方法返回地址等信息。
  • 堆内存:用于存储所有的 Java 对象和数组。堆是一个被所有线程共享的内存区域,用于存放在运行时创建的对象和数组。

②线程安全性:

  • 栈内存:是线程私有的,每个线程都有自己的栈,因此栈内存是线程安全的,不需要考虑多线程并发访问的问题。
  • 堆内存:是线程共享的,多个线程可以访问同一个对象,因此需要考虑线程安全问题,可能需要同步机制来避免数据竞争。

③内存管理

  • 栈内存:由系统自动分配和释放。每当方法调用时,栈帧自动分配;方法结束时,栈帧自动销毁,内存释放。
  • 堆内存:由垃圾回收器(GC)管理。Java 程序中对象的分配和释放由垃圾回收器负责,当对象不再被引用时,GC 会自动回收这些对象所占用的内存。

④存储大小:

  • 栈内存:通常较小且固定,每个线程有一个独立的栈,栈大小在程序启动时由虚拟机设置。
  • 堆内存:通常较大且可动态扩展,整个 Java 应用程序共享一个堆内存区域,堆大小可以在启动时通过 JVM 参数进行配置。

⑤内存溢出:

  • 栈内存:栈的内存不足会抛出 StackOverflowError,常见原因是递归调用过深或方法调用层次过多,导致栈帧数量过多。
  • 堆内存:堆的内存不足会抛出 OutOfMemoryError,常见原因是创建了过多的对象,或对象占用的内存过大,导致堆内存耗尽。

3- 小结:

3-1 什么是虚拟机栈?

在这里插入图片描述

3-2 垃圾回收是否涉及栈内存?

在这里插入图片描述

3-3 栈内存分配越大越好吗?

在这里插入图片描述

3-4 方法内的局部变量是否线程安全?

在这里插入图片描述

3-5 什么情况会导致栈内存溢出?

在这里插入图片描述

3-6 栈和堆的区别?

在这里插入图片描述


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

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

相关文章

深入Mysql-03-MySQL 表的约束与数据库设计

文章目录 数据库约束的概述约束种类主键约束唯一约束非空约束默认值外键约束 表与表之间的关系数据库设计 数据库约束的概述 对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。 约束种类 …

go-kratos 学习笔记(3) google buf 管理proto

google buf 管理proto,以及从新归档文件的目录结构 什么是 BSR? BSR 将 Protobuf 文件作为版本化模块进行存储和管理,以便个人和组织可以轻松使用和发布他们的 API。 BSR 带有可浏览的 UI、依赖项管理、API 验证、版本控制、生成的文档以及…

稳居中科院2区的SCIEI双检索期刊,听说一投就中!

IEEE TRANSACTIONS ON ELECTRON DEVICES,中科院2区,JCR Q2, SCI&EI双检索期刊,年发文量在1000篇左右,且大有继续扩刊的走向。有投稿经验的作者反馈,比较容易被录用。 期刊信息 IEEE TRANSACTIONS ON ELECTRON DE…

Python 机器学习求解 PDE 学习项目——PINN 求解一维 Poisson 方程

本文使用 TensorFlow 1.15 环境搭建深度神经网络(PINN)求解一维 Poisson 方程: − Δ u f in Ω , u 0 on Γ : ∂ Ω . \begin{align} -\Delta u & f \quad & \text{in } \Omega,\\ u & 0 \quad & \text{on } \Gamma:\partial \Om…

非对称加密算法RSA的OpenSSL代码实现Demo

目录 1 RSA简介 1.1 RSA算法介绍 1.2 RSA算法的速度与安全性 1.3 RSA存储格式 1.3.1 PKCS#1 标准主要用于 RSA密钥,其RSA公钥和RSA私钥PEM格式 1.3.2 PKCS#8 标准定义了一个密钥格式的通用方案,其公钥和私钥PEM格式 2 OpenSSL代码实现 2.1 生…

初学51单片机之指针基础与串口通信应用

开始之前推荐一个电路学习软件,这个软件笔者也刚接触。名字是Circuit有在线版本和不在线版本,这是笔者在B站看视频翻到的。 Paul Falstadhttps://www.falstad.com/这是地址。 离线版本在网站内点这个进去 根据你的系统下载你需要的版本红线的是windows…

第九讲:POU与变量基础

POU(Program Organization Unit)的分类 一、定义及分类 POU即程序组成单元 二、三种POU的作用 1、功能/功能快:看作算法 功能块的POU是比较复杂的指令 三、功能块POU和功能POU的区别 1、理解功能POU(对比) 不添加实例名,就不需要去建立变量,所以就不会占到内存。 因…

算法题目整合4

文章目录 122. 大数减法123. 滑动窗口最大值117. 软件构建124. 小红的数组构造125. 精华帖子126. 连续子数组最大和 122. 大数减法 题目描述 以字符串的形式读入两个数字,编写一个函数计算它们的差,以字符串形式返回。输入描述 输入两个数字&#xff…

物联网专业创新人才培养体系的探索与实践

一、引言 随着物联网(IoT)技术的迅猛发展,物联网领域的人才需求日益增加。物联网技术作为新一轮信息技术革命的核心,已经渗透到社会生活的各个领域,对推动经济转型升级、提升国家竞争力具有重要意义。因此&#xff0c…

VUE之---slot插槽

什么是插槽 slot 【插槽】, 是 Vue 的内容分发机制, 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素, 而这一个标签元素是否显示, 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…

自己开发软件实现网站抓取m3u8链接

几天前一个同学说想下载一个网站的视频找不到连接,问我有没有什么办法,网站抓取m3u8链接 网页抓取m3u8链接。当时一听觉得应该简单,于是说我抽空看看。然后就分析目标网页,试图从网页源码里找出连接,有的源代码直接有,但是有的没有…

Java二十三种设计模式-代理模式模式(8/23)

代理模式:为对象访问提供灵活的控制 引言 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代替或占位符,以控制对它的访问。 基础知识,java设计模式总体来说设计模式分为三大类&#…

Varjo XR-4系列现已获得达索3DEXPERIENCE平台官方支持

近日,全球领先的工业虚拟和混合现实解决方案提供商Varjo宣布,Varjo XR-4系列现已获得达索3DEXPERIENCE平台的本地支持。这种集成为工程师和设计师带来了先进的虚拟和混合现实功能,他们可以通过沉浸式技术创新并简化他们的3D工作流程。 在达索…

【iOS】Tagged Pointer

目录 前言什么是Tagged Pointer?引入Tagged Pointer技术之前引入Tagged Pointer之后总结 Tagged Pointer原理(TagData分析)关闭数据混淆MacOS分析NSNumberNSString iOS分析 判断Tagged PointerTagged Pointer应用Tagged Pointer 注意点 Tagge…

Qt绘制指南针(仪表盘绘制封装使用)

指南针是一种用来确定方向的工具。它由一个磁针制成,其一端被磁化,可以自由旋转。当放置在水平面上时,磁针会指向地球的磁北极。通过观察磁针的指向,我们可以确定地理北方的方向。本示例是在Qt中绘制一个指南针,通过继…

Android WebViewClient 的 `shouldOverrideUrlLoading` 方法

简介 在Android开发中,WebView是一个强大的工具,可以在你的应用中显示网页内容。了解 WebViewClient 中的 shouldOverrideUrlLoading 方法是至关重要的,因为这个方法允许你控制 URL 在 WebView 中的处理方式。 在本文中,我们将详…

S71200 - 笔记

1 S71200 0 ProfiNet - 2 PLC编程 01.如何零基础快速上手S7-1200_哔哩哔哩_bilibili 西门子S7-1200PLC编程设计学习视频,从入门开始讲解_哔哩哔哩_bilibili

Linux:进程信号(一.认识信号、信号的产生及深层理解、Term与Core)

上次结束了进程间通信的知识介绍:Linux:进程间通信(二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量 文章目录 1.认识信号进程看待信号方式 2.信号的产生2.1信号的处理的方式 --- signal()函数2.2kill指令产生信号2.3键盘产生…

最新快乐二级域名分发系统重置版v1.7源码-最新美化版+源码+可对接支付

源码简介: 最新快乐二级域名分发系统重置版v1.7源码,它是最新美化版源码可对接支付。 快乐二级域名分发系统重置版v1.7源码,简单快捷、功能强大的控制面板。系统稳定长久,控制面板没任何广告,让网站更实用方便。 最…

现货白银交易中spring形态的应用

在现货白银市场中交易想取得成功并从市场中获利,掌握一些工具是必不可少的,而今天我们要介绍的现货白银的交易工具就是spring形态。 对于spring这个英文,我们都很熟悉,它有春天的意思,但这里所说的spring形态并不是指春…