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

news2024/12/23 19:09:35

目录

  • 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.coloradmin.cn/o/1942493.html

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

相关文章

数据传输工具性能深度评测(阿里云、百度智能云)

阿里云、百度智能云作为领先的云服务提供商,都为数据库提供了配套的数据库工具服务,其中 DTS 是迁移与同步业务的核心服务,本次测试旨在深入比较阿里云与百度智能云在 DTS 数据传输服务性能方面的表现,为企业在选择合适的数据传输…

电商比价平台的功能讲解及数据采集分析

引言 随着电子商务的快速发展,电商比价平台作为连接消费者与供应商的重要桥梁,其重要性日益凸显。这类平台通过自动化的比价功能,不仅帮助消费者快速找到性价比最高的商品,还为企业提供了高效的采购工具,实现了采购成…

winfrom 文件自动生成

数据页面展示 添加定时器执行每个表数据的生成计划 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; using …

qt中charts图表的使用方法

折线图 #include "widget.h" #include "ui_widget.h" #include <QtCharts/QChart> #include <QtCharts/QChartView> #include <QtCharts/QLineSeries> #include<QVBoxLayout>Widget::Widget(QWidget *parent): QWidget(parent), …

知识图谱 | 基于电商网站中的商品分类目录构建知识图谱

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在构建一个基于电商网站商品分类目录的知识图谱&#xff0c;通过Python程序爬取分类信息&#xff0c;形成商品的目录树&#xff0c;并提取底层商品的概念信息。项目将重点展示如何利用知识图谱呈现概念层级知识&#xf…

等保测评练习卷17

等级保护初级测评师试题17 姓名&#xff1a; 成绩&#xff1a; 判断题&#xff08;10110分&#xff09; 1. 关于安全区域边界的安全审计&#xff0c;三级系统的要求包括应对审计进程进行保护&#x…

Java实现分卷压缩功能,不引入第三方依赖的实现方式

分卷压缩 分卷压缩是一种将一个大文件分割成多个较小文件的压缩方法。这种方法通常用于便于存储、传输或备份大文件。分卷压缩的主要特点和步骤包括: 分割大文件:将一个大文件分割成多个较小的文件,每个小文件称为一个“分卷”。压缩分卷:对每个分卷进行压缩,以减少每个分…

【复习】软件工程

软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。 典型表现&#xff1a; 开发成本和进度的估计常常很不准确 用户对已完成的软件系统不满意&#xff0c;闭门造车 软件质量&#xff08;quality&#xff09;不可靠 软件常常是不可维护的 软件产品供不应…

java的DOS命令

目录 1.DOS命令了解 DOS介绍 常用的dos命令1 DOS的基本原理 相对路径与绝对路径 常用的dos命令2 2.本章作业 1.编写hello&#xff0c;world程序 2.输出个人基本信息 3.jdk&#xff0c;jre&#xff0c;jvm关系 4.环境变量path配置及作用 5.java编写步骤 6.java编写7…

14、如何⽤DDD设计微服务代码模型

在完成领域模型设计后&#xff0c;接下来我们就可以开始微服务的设计和 落地了。在微服务落地前&#xff0c;⾸先要确定微服务的代码结构&#xff0c;也就是我 下⾯要讲的微服务代码模型。 只有建⽴了标准的微服务代码模型和代码规范后&#xff0c;我们才可以将 领域对象映射到…

C#初级——输出语句和转义字符

输出语句 在C#中&#xff0c;C#的输出语句是通过Console类进行输出&#xff0c;该类是一个在控制台下的一个标准输入流、输出流和错误流。使用该类下的Write()函数&#xff0c;即可打印要输出的内容。 Console.Write("Hello World!"); //在控制台应用中打印Hell…

websocket状态机

websocket突破了HTTP协议单向性的缺陷&#xff0c;基于HTTP协议构建了双向通信的通道&#xff0c;使服务端可以主动推送数据到前端&#xff0c;解决了前端不断轮询后台才能获取后端数据的问题&#xff0c;所以在小程序和H5应用中被广泛使用。本文主要集合报文分析对于websocket…

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

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

2024.7.22(nfs、samba)

一、web_server作用是发布nginx的web项目 1、停用selinux关闭防火墙 [rootnfs_server ~]# setenforce 0 [rootnfs_server ~]# vim /etc/selinux/config [rootnfs_server ~]# systemctl stop firewalld [rootnfs_server ~]# systemctl disable firewalld 2、安装nginx [rootwe…

四、GD32 MCU 常见外设介绍 (4) EXTI 中断介绍

4.EXTI 中断介绍 EXTI(中断/事件控制器)包含多个相互独立的边沿检测电路并且能够向处理器内核产生中断请求或唤醒事件。 EXTI 有三种触发类型&#xff1a;上升沿触发、下降沿触发和任意沿触发。 EXTI中的每一个边沿检测电路都可以独立配置和屏蔽。 4.1.GD32 EXTI 外设原理简介…

Nginx Rewrite(企业网站架构部署与优化)

Nginx Rewrite介绍 本章结构 实验步骤&#xff1b; 先在服务器1上写三个location&#xff1b;且等级各不相同&#xff1b; 如下&#xff1b;先将之前的location注释掉&#xff0c;避免冲突&#xff1b; 重启服务后生效&#xff1b; 如果用户输入的域名后只加了一个/或/都没有…

深入浅出C语言指针(进阶篇)

深入浅出C语言指针(基础篇) 深入浅出C语言指针(进阶篇) 目录 引言 一、指针和数组 1.数组名的理解 2.指针访问数组 3.一维数组传参的本质 二、二级指针 1.二级指针的概念 2.二级指针的内存表示 3.二级指针的解引用 三、字符指针 1.指针指向单个字符 2.指针指向字…

JavaWeb(4)JavaScript入门2—— JS的对象和JSON

一、JS的对象 1.声明语法1 通过new Object()直接创建对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…

Linux——vi和vim编辑器

目录 基本介绍 vi和vim常用的三种模式 vi和vim的常用快捷键 基本介绍 vi和vim常用的三种模式 vi和vim的常用快捷键 网上找的快捷键盘图

docker搭建ES 8.14 集群

参考&#xff1a;【docker搭建es8集群kibana】_docker 安装生产级 es 8.14 集群-CSDN博客 1、之前已搭建一台单机版的dockerES集群 参见 Elasticsearch docker 安装_docker 安装es8.14.3-CSDN博客 2、现在需要重新搭建为docker ES集群 准备新搭建3个点 一、准备工作 提前开…