JVM(HotSpot):虚拟机栈(JVM Stacks)与本地方法栈(Native Method Stacks)

news2024/11/19 18:43:09

文章目录

  • 一、内存结构图
  • 二、数据结构-栈
  • 三、JVM栈
  • 四、本地方法栈
  • 五、问题辨析
    • 1、垃圾回收是否涉及栈内存?
    • 2、栈内存越大越好吗?
    • 3、方法内的局部变量是否线程安全?
    • 4、栈内存溢出问题

一、内存结构图

在这里插入图片描述

二、数据结构-栈

数据结构中,栈的特点是什么?
简而言之:先进后出。
类比手枪的子弹夹

三、JVM栈

定义
1、每个线程运行时,所需要的内存。
2、每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存空间。
3、每个线程只能有一个活动栈帧,对应着程序当前执行的方法。

IDEA 演示
在这里插入图片描述在这里插入图片描述

四、本地方法栈

那些不是由Java编写的接口方法,比如用C语言或者C++语言开发的本地方法,让Java可以通过调用本地方法,来间接与操作系统更底层的相关API交互。
此时,运行本地方法所用的内存,就是本地方法栈。
比如Thread类里面,Object类里面的native方法,都是本地方法。
在这里插入图片描述

五、问题辨析

1、垃圾回收是否涉及栈内存?

答:不会,因为栈是给方法运行时的内存空间,所以,当方法执行完毕时,会自动释放内存。故而不需要GC来清理空间。

2、栈内存越大越好吗?

答:不是的。
栈内存和线程并发数有着相关关系。
当JVM总内存一定时,栈内存越大,那么,对应的线程数就越少。
比如,500MB的JVM内存,那么,栈内存设置为1MB,并发线程数理论上是500个,如果栈内存设置为10MB,那么,并发线程数就是50个。

设置栈内存
-Xss1m
在这里插入图片描述

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

答:判断变量是否安全的原则是,这个变量是否被多线程共享。
所以,方法内的局部变量是线程安全的。它不会被多个线程共享。

但是,要注意
方法内的局部变量,作用域不能逃出方法外,否则,依然是线程不安全的。
例如,入参和返参都是线程不安全的。
像下面的method1是安全的,method2,method3的sb变量是不安全的。

	private static void method1() {
		StringBuilder sb = new StringBuilder();
		sb.append(1);
		sb.append(1);
		sb.append(1);
		System.out.println(sb.toString());
	}

	private static void method2(StringBuilder sb) {
		sb.append(1);
		sb.append(1);
		sb.append(1);
		System.out.println(sb.toString());
	}

	private static StringBuilder method3() {
		StringBuilder sb = new StringBuilder();
		sb.append(1);
		sb.append(1);
		sb.append(1);
		return sb;
	}

4、栈内存溢出问题

1、栈内的栈帧过多,导致的内存溢出。
这种情况一般发生在递归调用的时候。

错误复现

public class Demo2 {
	private static int count;

	public static void main(String[] args) {
		try {
			method();
		} catch (Throwable e) {
			e.printStackTrace();
			System.out.println("运行次数:"+count);
		}
	}

	private static void method() {
		count++;
		method();
	}
}

在这里插入图片描述
还有可能是在对象数据格式化的时候出现。
比如,对象转json字符串。
如果出现,bean互相套用,也会出现无限循环的情况,导致StackOverflowError
2、栈帧过大导致的溢出。
这种情况是,方法内的局部变量太大了,直接超过了栈的内存,导致的。
比如,一个方法内,String 变量的值特别大,就可以导致这个错误发生。

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

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

相关文章

windows 系统服务在注册表中的位置

计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services 此注册表项下是系统服务安装信息 利用此注册表项可以获取服务详细信息

新版Android Studio Koala 导入github第三方依赖 maven仓库的处理方法 (java版)

以下是依赖的处理 这是由于Android Studio 构建项目模式发生改变了。 旧版项目构造 创建新的项目采用build.gradle.kts配置。 先看旧版同样的配置是什么样的。 再来查看新版带.kts后缀文件官方自带的库是怎么配置,模拟配置就OK。 先看libs文件这个库的写法。 …

隐藏SpringBoot自动生成的文件

第一种方法——删除 第二种方法——Settings——Editor——fail types

题库系统平台开发功能解析

题库系统开发功能介绍可以从多个方面进行阐述,以下是一些核心功能及其详细解释 1. 题库管理系统 题目录入与编辑:提供灵活的题目录入方式,支持手动输入、批量导入(如从Excel、Word等文件中导入)以及从其他题库中复制试…

HuggingChat macOS版正式发布!文章内附体验地址!我国打造糖尿病专用AI模型|AI日报

文章推荐 全新豆包AI视频模型发布!实测下的可灵与豆包!原来它们的差距不止一点点... 今日热点 我国团队打造糖尿病专用AI模型 上海交通大学清源研究院MIFA实验室携手复旦大学附属中山医院内分泌科,组建专家团队,联手开发一款名…

Spring Boot项目连接Oracle数据库启动报错:Undefined Error

描述:远程拉下来的代码,配置了maven仓库后,未进行其他修改,自己本地启动报错。 报错现状: 解决:添加参数-Duser.nameuser后,启动成功。 原因分析: 分析一: maven仓…

Altium Designer脚本系统内置函数汇总(2417个)

Altium Designer脚本系统内置函数汇总(2417个) ↑↑↑点击上方蓝字,关注我们! Altium Designer 2013脚本系统内置函数,一共2417个。 这些函数名称复制到Altium Designer 2013脚本编辑器中会自动变为褐红色(#800000),内部函数大部分…

跨境必备:3个必不可少的低预算营销渠道

不管是跨境电商卖家还是外贸从业人员,从个体到企业或品牌,流量都是宣传营销领域的重点。有流量才能让更多的消费者看到自己的产品,从而有机会了解产品并促成转化。 各大跨境电商平台、社交媒体平台和搜索引擎等平台都提供了付费营销功能&…

16.网络编程(下篇)

目录 1.网络编程概述 2.应用软件架构 3.网络编程三要素-IP地址 4.网络编程三要素-端口与协议 5.UDP通信程序 6.TCP通信程序 1.网络编程概述 1.1计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系…

【问题解决】win10日志错误:创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013

背景 最近win10死机了一次,查看事件管理器发现有大量的报错:“创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013”,如图: 解决 win键搜索internet选项 确定。 原因 参考错误:“ 创建 TLS 客户端凭据…

C++基础知识9 模版进阶

模版进阶 1. 非类型模板参数2. 模板的特化2.1 概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.3.2 偏特化2.3.3 类模板特化应用示例 3 模板分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法 4. 模板总结 1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类…

有些硬盘录像机接入视频汇聚平台EasyCVR后通道不显示/显示不全,该如何处理?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能,还支持多种主流标准协议,如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…

C#获取变量的数据类型_C#获取对象的数据类型

C#中的数据类型用 Type 类描述,具体的类型是 Type的对象 一、object.GetType() 对象.GetType()-----对象不能为null,否则运行报错; 通用的获取类型方式 底层对象获取类型,所有的对象,变量获取类型,GetType(); 返回的…

JAVA打造全球商品集散地国际版多商户商城系统小程序源码

打造全球商品集散地 —— 国际版多商户商城系统 🌍【开篇:连接世界,触手可及】🌍 在这个全球化的时代,购物不再受地域限制,每一个消费者都渴望能轻松买到来自世界各地的优质商品。而“打造全球商品集散地”…

快速实现AI搜索!Fivetran 支持 Milvus 作为数据迁移目标

Fivetran 现已支持 Milvus 向量数据库作为数据迁移的目标,能够有效简化 RAG 应用和 AI 搜索中数据源接入的流程。 数据是 AI 应用的支柱,无缝连接数据是充分释放数据潜力的关键。非结构化数据对于企业搜索和检索增强生成(RAG)聊天…

深度学习500问——Chapter17:模型压缩及移动端部署(1)

文章目录 17.1 模型压缩理解 17.2 为什么需要模型压缩和加速 17.3 模型压缩的必要性及可行性 17.4 目前有哪些深度学习模型压缩方法 17.4.1 前段压缩和后端压缩对比 17.4.2 网络剪枝 17.4.3 典型剪枝方法对比 17.4.4. 网络蒸馏 17.4.5 前端压缩 17.4.6 后端压缩 深度神经网络在…

刚毕业就做项目经理,现在感觉越做越没动力,还有必要坚持下去吗?

那种一毕业就做项目经理的,以为是少走10年弯路,干了一年后,才发现这简直就是在坑自己。没点真材实料,经理也变成了“空中架子”。 因此,很多一毕业就当上项目经理的人,要么是干着干着就转回到技术岗位&…

AI数字人:终于知道视频号咋爆的了

点击下方👇“拂晓AI数字人”关注公众号 一起学习AI 数字人,让服务更高效! 做视频号是不是有这种感觉,辛辛苦苦剪了几个小时的视频,上去就是几百播放量,就没有流量了,很抓狂。 找别人的爆的视频&…

2.点位管理——帝可得后台管理系统

目录 前言点位管理菜单模块1.需求说明2.库表设计3.生成基础代码0 .使用若依代码生成器最终目标1.创建点位管理2.添加数据字典3.配置代码生成信息4.下载代码并导入项目 4.优化菜单——点位管理1.优化区域管理2.增加点位数 前言 提示:本篇介绍点位管理模块&#xff0…

知识库管理系统盘点:2024年必备10款

在当今信息爆炸的时代,高效地组织、存储、管理和共享知识与信息,已成为企业提升竞争力和实现数字化转型的关键。知识库管理系统(Knowledge Base Management System, KBMS)作为重要工具,正受到越来越多企业的青睐。本文…