《深入理解Java虚拟机》——Java内存区域与内存溢出异常
Java内存区域与内存溢出异常
- 运行时数据区域
- 程序计数器
- Java虚拟机栈
- 本地方法栈
- Java堆
- 方法区
- 运行时常量池
- 直接内存
- 实例
- 堆溢出
- 栈溢出
运行时数据区域
根据《Java虚拟机规范的规定》,Java虚拟机所管理的内存将会包含已下架几个运行时数据区域。
程序计数器
在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域。
Java虚拟机栈
Java虚拟机栈也是线程私有的,它的生命周期和线程相同。虚拟机描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步一个栈帧用于存储局部变量表、操作书栈、动态连接、方法出口等信息。
在《Java虚拟机规范》中,对这个内存区域规定了两类异常情况:如果线程请求的栈深度大于虚拟机所运行的深度,将抛出StackOverflowError异常;如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。
本地方法栈
本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用的本地(Native)方法服务。
与虚拟机栈一样,本地方法栈也会抛出StackOverflowError异常和OutOfMemoryError异常。
Java堆
对于Java应用程序来说,Java堆是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动是创建。此内存区域的唯一目的就是存放对象实例。Java堆是垃圾收集器管理的内存区域,因此一些资料中它也被称作“GC堆”。
Java堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩展来实现的(通过参数-Xmx和-Xms)设定。如果在Java堆中没有内存完成实例分配,并且堆也无法扩展时,Java虚拟机会抛出OutOfMemoryError异常。
方法区
方法区和Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编编译后的代码缓存等数据。
根据《Java虚拟机规范》的规定,如果方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。
运行时常量池
运行时常量池是方法区的一部分。Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
常量池无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。
直接内存
直接内存并不是数据区的一部分,但是这部分内存也被频繁使用,而且可能导致OOM异常。
在JDK1.4中新加入的NIO类,引入可基于通道与缓冲区的I/O方式,他可以使用Native函数库直接分配堆外内存。
实例
堆溢出
package jvm.dir01;import java.util.ArrayList;
import java.util.List;public class HeapOOM {static class OOMObject{}public static void main(String[] args) {List<OOMObject> list = new ArrayList<>();while (true) {list.add(new OOMObject());}}
}Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:3210)at java.util.Arrays.copyOf(Arrays.java:3181)at java.util.ArrayList.grow(ArrayList.java:267)at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:241)at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:233)at java.util.ArrayList.add(ArrayList.java:464)at jvm.dir01.HeapOOM.main(HeapOOM.java:14)
栈溢出
package jvm.dir01;public class JavaVMStackSOF {int count = 1;public void stackLeak() {count++;stackLeak();}public static void main(String[] args) {JavaVMStackSOF javaVMStackSOF = new JavaVMStackSOF();try {javaVMStackSOF.stackLeak();}catch (Exception e){System.out.println("length:" + javaVMStackSOF.count);throw e;}}
}Exception in thread "main" java.lang.StackOverflowErrorat jvm.dir01.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:9)at jvm.dir01.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:9)相关文章:
《深入理解Java虚拟机》——Java内存区域与内存溢出异常
Java内存区域与内存溢出异常 运行时数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 实例堆溢出栈溢出 运行时数据区域 根据《Java虚拟机规范的规定》,Java虚拟机所管理的内存将会包含已下架几个运行时数据区域。 程序计数器 在Java虚…...
公众号hanniman往期精选
目录 一、AI产品分析(10篇) 二、AI产品经理(10篇) 三、AI技术(10篇) 四、AI行业及个人成长(10篇) 一、AI产品分析 1、【重点】深度 | 关于AIGC商业化的13个非共识认知(80…...
谷粒商城----缓存与分布式锁
1、缓存使用 为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。而 db 承担数据落盘工作。 哪些数据适合放入缓存? 即时性、数据一致性要求不高的 访问量大且更新频率不高的数据(读多,写少&…...
【JavaEE进阶】Spring事务和事务传播机制
文章目录 一. 什么是Spring事务二. Spring中事务的实现1. Spring编程式事务2. 声明式事务2.1 trycatch下事务不会自动回滚的解决方案2.2 Transactional 作用范围2.3 Transactional 参数说明2.4 Transactional 工作原理 三. 事务的隔离级别1. 事务的四大特性2. Spring中设置事务…...
【Hive】drop table需注意外部表
什么是内部表,外部表? 比较专业的定义: 外部表需要转为内部表,执行删除操作才能真的删表结构删表数据。否则drop table仅是删除了表数据,表结构还是存在的。 alter table tb_name set TBLPROPERTIES(EXTERNALfalse);…...
【2023数学建模国赛】A题定日镜场的优化设计模型建立
2023年全国大学生数学建模竞赛A题定日镜场的优化设计,目前已写出第四版国赛A题思路和模型详细公式,目录如下: 一、 问题重述... 1 二、 问题分析... 1 三、 模型假设... 6 四、 问题一模型的建立和求解... 6 4.1 定日镜场坐标系的建立...…...
QT 事件与信号区别
事件(Event)和信号(Signal)是两个在编程中具有不同概念和用途的术语。 事件(Event): 事件是程序运行过程中发生的特定动作或状态改变。可以是用户输入、硬件触发、系统通知等。 事件通常由操作…...
[Vue3 博物馆管理系统] 使用Vue3、Element-plus tabs组件构建选项卡功能
系列文章目录 第一章 定制上中下(顶部菜单、底部区域、中间主区域显示)三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus走马灯组件构建轮播图 第四章 使用Vue3、Element-plus tabs组件构建选项卡功能 [第五…...
【算法专题突破】滑动窗口 - 长度最小的子数组(9)
目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:209. 长度最小的子数组 - 力扣(Leetcode) 要注意的是,题目给的是正整数, 而题目要求并不难理解,就是找最短的…...
骨传导与入耳式耳机哪种音质好?该如何选择?
骨传导耳机和传统耳机的定位不同,所以没有可比性,如果一定要说哪款耳机音质好,答案是入耳式耳机音质比较好! 首先入耳式耳机是直接塞入耳朵佩戴,会最大程度减少漏音,同时不会改变音质,会直接传…...
【多线程】Timer任务定时器实现与盲等原子性问题的解决
目录 一、定时器 二、标准库中的Timer 三、代码实现 四、死锁 一、定时器 代码中的定时器通常是在一定的时间执行对应的代码逻辑 二、标准库中的Timer public static void main(String[] args){Timer timer new Timer();timer.schedule(new TimerTask() {Overridepublic…...
SpringCloud-GetWay 路由网关
接上文 SpringCloud-Hystrix 服务降级与熔断 微服务也是如此,不是所有微服务需要直接暴露给外部调用,就需要使用路由机制,添加一层防护,让所有的请求全部通过路由来转发到各个微服务,并转发给多个相同微服务实例&#…...
使用生成式 AI 增强亚马逊云科技智能文档处理
数据分类、提取和分析对于处理大量文档的组织来说可能具有挑战性。传统的文档处理解决方案是手动的、昂贵的、容易出错的,并且难以扩展。利用 Amazon Textract 等 AI 服务,亚马逊云科技智能文档处理(IDP)允许您利用业界领先的机器学习(ML)技术来快速准确地处理任何扫描文档或图…...
谈论浏览器内核
浏览器内核是指浏览器使用的渲染引擎,用于解析并显示网页的内容。主要有以下几种浏览器内核: Trident(IE内核):由Microsoft开发,被用于Internet Explorer浏览器。目前已经被Edge取代。 Gecko:…...
电商卖家保障数据隐私和安全用什么安全的浏览器?
在如今信息爆炸的时代,个人数据安全成为了一个备受关注的话题。越来越多的人意识到,保护个人数据的重要性。为此,安全浏览器应运而生,为用户提供更加安全可靠的上网环境,保障个人数据的安全。 一、数据安全的重要性 …...
ECS通过DNAT将C非专线网段并网
1.问题描述 客户需求:ECS1需要访问140.131.208.0/24 ,由于140.131.208.0/24网段属于公网地址,在CSW侧为进行并网。 解决方案:故将ECS1发起的请求其在云内ECS2做DNAT,将该网段转换成CSW并网网段170.101.253.0/24&…...
g++模板显式实例化big file例子
前言 模板是编程中高级工具,类似C语言的宏生成代码,但却比宏更强大,例如,对于调试的支持,以及实现更严格的语法检查。 如果用节省代码来定义工具的好坏,无疑不管用C语言宏来生成代码,或者用C的…...
Redis 删除策略
文章目录 Redis 删除策略一、过期数据二、数据删除策略1、定时删除2、惰性删除3、定期删除4、删除策略对比 三、逐出算法 Redis 删除策略 一、过期数据 Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态 XX &a…...
自动化运维——ansible (五十二) (01)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、概述 1.1 为什么要用自动化运维软件 1.2 自动化运维 1.3 自动化运维要注意的方面 1.4 自动化运维主要关注的方面 1.5 常见的开源自动化运维软件 1.6 自动化运维软件…...
渗透测试漏洞原理之---【不安全的反序列化】
文章目录 1、序列化与反序列化1.1、引入1.2、序列化实例1.2.1、定义一个类1.2.2、创建 对象1.2.3、反序列化1.2.4、对象注入 2、漏洞何在2.1、漏洞触发2.1.2、定义一个类2.1.3、定义一个对象2.1.3、反序列化执行代码 2.2 为什么会这样 3、反序列化漏洞攻防3.1、PHP反序列化实例…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
