【学习笔记】深入理解Java虚拟机学习笔记——第2章 Java内存区域与内存溢出异常
第2章 Java内存区域与内存溢出异常
2.1 概述
略
2.2 运行时数据区域
2.2.1 程序计数器
线程私有,记录执行的字节码位置
2.2.2 Java 虚拟机栈
线程私有,存储一个一个的栈帧,通过栈帧的出入栈来控制方法执行。
-栈帧:对应一个方法,用于存储局部变量表、操作数栈、动态连接、方法出口等信息。
-局部变量表:方法中的基本类型/引用类型的指针。
2.2.3 本地方法栈
同上,针对于Native方法提供服务。
2.2.4 Java堆(线程共享)
存储对象实例及数组,为方便GC,一般分为新生代(Eden、S0、S1),老年代等。
2.2.5 方法区
线程共享,存储class文件、常量、静态变量、即时编译后的代码缓存。
-class文件:类的版本、字段、方法、接口、常量池表。
2.2.6 运行时常量池
线程共享,存储编译器产生的各种字面量与符号引用。可动态运行时存入,如String类、Integer(1-100)等。
2.2.7 直接内存
NIO类可直接分配堆外内存。
【思考:多个线程共同操作一段内存,不一定必须加锁,可以为单个线程指定某段单独使用的区域,不够了在加锁。】
2.3 HotSpot 虚拟机对象探秘
2.3.1 对象的创建
1>查看相应类是否已加载、解析、初始化过,若无则加载
2>分配内存(一个对象占用的内存大小是一开始便确定的)
3>初始化为初始值(对象为null,数字为零值等)
4>设置对象头信息,GC分代及偏向锁等
5>为各字段赋值
2.3.2 对象的内存布局
1>对象头:指向类型指针、hashcode、锁信息等
2>对象字段内容
3>对齐填充:对象地址七点必须为8字节的倍数
2.3.3 对象的访问定位
1>句柄访问:对象引用指向堆中的句柄池,句柄池存储对象实际引用及class数据指针
好处:GC时压缩后,只修改句柄值,不必改对象引用
2.直接引用:对象引用指针指向对象实际存储地址,对象头中存储class指针
好处:只使用对象本身时只访问一次,速度快
2.4 实战:OutOfMemoryError异常
2.4.1 Java堆溢出
1>内存溢出:有用的对象存不下了
2>内存泄露:没用的对象GC时回收不了
2.4.2 虚拟机栈和本地方法栈溢出
1>线程请求调用过深,抛出StackOverflowError
2>允许动态扩展内存时,申请不到,抛出OutOfMemoryError
无论栈帧太大或栈帧过多,这里都是stackOverflowError,只有当栈大小动态扩容失败时,才报OOM。
【当线程创建时会赋予栈内存与本地方法栈内存,若创建的线程过多,可能出现系统内存不够报出OOM异常。此时可以通过减小栈内存来支持更多的线程被创建。】
2.4.3 方法区和运行时常量池溢出
-JDK6之后常量池移入Java堆中,intern方法第一次遇到的字符串直接放入Java堆的常量池中,不需要进行复制
-JDK6之后不会因为常量池过大导致方法区溢出
2.4.4 本机直接内存溢出
直接申请系统内存,而不是JVM内存,一般多见于NIO的使用。
特征:
1>Dump文件很小
2>无明显异常
3>用了NIO
4>异常堆栈发现了Vnsafe关键字
相关文章:
【学习笔记】深入理解Java虚拟机学习笔记——第2章 Java内存区域与内存溢出异常
第2章 Java内存区域与内存溢出异常 2.1 概述 略 2.2 运行时数据区域 2.2.1 程序计数器 线程私有,记录执行的字节码位置 2.2.2 Java 虚拟机栈 线程私有,存储一个一个的栈帧,通过栈帧的出入栈来控制方法执行。 -栈帧:对应一个…...

Python全流程开发实战:基于IMAP协议安全下载个人Gmail邮箱内所有PDF附件
在日常办公场景中,面对成百上千封携带PDF附件的邮件,手动逐一下载往往耗时耗力,成为效率瓶颈。如何通过代码实现“一键批量下载”?本文将以**“Gmail全量PDF附件下载工具”**开发为例,完整拆解从需求分析到落地交付的P…...
【验证技能】VIP项目大总结
VIP项目快做一段落了,历时一年半,也该要一个大汇总。 VIP简介 VIP开发流程 VIP难点 进程同步 打拍插入不同bit位宽数据问题。 动态升降lane VIP做的不好的地方和改进想法 各层之间交互 testsuite两端关键 所有层的实现架构不统一 VIP经验 ** 架构…...

Pytest-mark使用详解(跳过、标记、参数 化)
1.前言 在工作中我们经常使用pytest.mark.XXXX进行装饰器修饰,后面的XXX的不同,在pytest中有不同的作 用,其整体使用相对复杂,我们单独将其抽取出来做详细的讲解。 2.pytest.mark.skip()/skipif()跳过用例 import pytest #无条…...

【浅尝Java】Java简介第一个Java程序(含JDK、JRE与JVM关系、javcdoc的使用)
🍞自我激励:每天努力一点点,技术变化看得见 文章目录 Java语言概述Java是什么Java语言的重要性Java语言发展简史Java语言特性 第一个Java程序main方法示例运行Java程序JDK、JRE、JVM之间的关系注释基本规则注释规范 标识符关键字 Java语言概述…...
游戏打击感实现
视觉表现 1.帧冻结(卡肉) 原理:在攻击命中的瞬间暂停动画播放(通常0.1-0.3s),伯尼真实打击时的反作用力停滞感。实现:通过控制动画播放速度(如Unity的Animator.speed)结…...

项目三 - 任务2:创建笔记本电脑类(一爹多叔)
在本次实战中,我们通过Java的单根继承和多接口实现特性,设计了一个笔记本电脑类。首先创建了Computer抽象类,提供计算的抽象方法,模拟电脑的基本功能。接着定义了NetCard和USB两个接口,分别包含连接网络和USB设备的抽象…...

Electron学习+打包
1. 什么是 Electron? Electron 是⼀个 跨平台桌⾯应⽤ 开发框架,开发者可以使⽤:HTML、CSS、JavaScript 等 Web 技术来构建桌⾯应⽤程序,它的本质是结合了 Chromium 和 Node.js ,现在⼴泛⽤于桌⾯应 ⽤程序开发&a…...

NumPy线性代数功能全解析:矩阵运算与方程求解实用指南
NumPy 是线性代数领域中高效的工具。它可以帮助完成矩阵运算和方程求解。本文将介绍 NumPy 中用于线性代数的常用函数。 矩阵乘法 矩阵乘法会根据两个矩阵生成一个新矩阵。具体做法是将第一个矩阵的每一行与第二个矩阵的每一列相乘,并将乘积相加,得到新…...

《RabbitMQ 全面解析:从原理到实战的高性能消息队列指南》
一、RabbitMQ 核心原理与架构 1. 核心组件与工作流程 RabbitMQ 基于 AMQP 协议,核心组件包括 生产者(Producer)、交换机(Exchange)、队列(Queue) 和 消费者(Consumer)。…...
jenkins slave节点打包报错Failed to create a temp file on
jenkins slave节点打包报错 一、报错信息 FATAL: Unable to produce a script file Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to slave-83at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1784)at hudson.remoting.UserRequest$…...
计算机视觉——通过 OWL-ViT 实现开放词汇对象检测
介绍 传统的对象检测模型大多是封闭词汇类型,只能识别有限的固定类别。增加新的类别需要大量的注释数据。然而,现实世界中的物体类别几乎无穷无尽,这就需要能够检测未知类别的开放式词汇类型。对比学习(Contrastive Learning)使用成对的图像和语言数据,在这一挑战中备受…...

Android Framework学习二:Activity创建及View绘制流程
文章目录 Window绘制流程Window Manager Service(WMS)SurfaceSurfaceFlinger 安卓View层次结构ActivityPhoneWindowActivity与PhoneWindow两者之间的关系ViewRootImplDecorViewDecorView 的作用DecorView 的结构总结 Activity创建流程View invalidate调用…...

python如何在深度学习框架目标检测算法使用Yolov8训练道路汽车漆面车漆缺陷数据集 建立基于YOLOv8道路汽车漆面缺陷(划痕)检测系统
基于YOLOv8道路汽车漆面缺陷(划痕)检测系统 文章目录 1. 安装依赖2. 数据集准备与划分3. 数据预处理4. 配置YOLOv85. 训练和评估模型6. 推理与可视化7. 构建GUI应用程序 道路汽车漆面车漆缺陷检测数据集1221张 1类 汽车漆面缺陷检测YOLO数据集 1221张…...

高性能、云原生的对象存储服务MinIO 详细介绍与案例应用
什么是MinIO? MinIO是一个高性能、云原生的对象存储服务,采用Apache License v2.0开源协议发布。它与Amazon S3云存储服务API兼容,适合构建高性能、可扩展的存储基础设施。支持大规模非结构化数据的存储,适合图片、视频、日志、备…...
Tailwind CSS 响应式设计解析(含示例)
本文内容: Tailwindcss V4 中如何使用响应式设计功能,包括默认断点、自定义断点、断点范围控制以及容器查询的各种技巧,帮助你在不离开 HTML 的前提下优雅构建响应式页面。 🌟 默认断点用法(移动优先) Tail…...

Arduino按键开关编程详解
一、按键开关的基本原理与硬件连接 1.1 按键开关的工作原理 按键开关是一种常见的输入设备,其核心原理基于机械触点的闭合与断开。当用户按下按键时,内部的金属片会连接电路两端,形成通路;松开按键后,金属片在弹簧作…...

鸢尾花(Iris)数据集的多模型分类与可视化分析工具
该程序是一个鸢尾花(Iris)数据集的多模型分类与可视化分析工具,主要功能如下: 1. 数据加载与预处理 功能说明: 使用sklearn.datasets.load_iris()加载经典的鸢尾花数据集。将数据转为pandas.DataFrame,并将类别数字标签映射为中文类别名(山鸢尾、变色鸢尾、维吉尼亚鸢尾…...
【软件设计师:复习】上午题核心知识点总结(一)
一、数据结构与算法(高频) 1. 线性数据结构 数组与链表 数组:随机访问(O(1))、插入/删除(O(n))、内存连续。链表:单向链表、双向链表、循环链表;插入/删除(O(1))、随机访问(O(n))。典型问题: 合并两个有序链表(LeetCode 21)。链表反转(迭代/递归实现)。栈与…...

[蓝桥杯 2023 国 Python B] 划分 Java
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int[] arr new int[41];int sum 0;for (int i 1; i < 40; i) {arr[i] sc.nextInt();sum arr[i];}sc.close();int target sum / 2; // 最接近的两…...
Node.js 应用部署:镜像体积优化与安全的多阶段构建探索
Node.js 应用部署:镜像体积优化与安全的多阶段构建探索 在开发 Node.js 应用时,部署过程中的镜像体积优化和安全性保障是至关重要的环节。本文将通过两种不同的 Docker 部署方式,深入探讨如何实现高效的镜像体积优化和安全的部署环境。 传统的单阶段构建方式 许多开发者在…...
【Java面试笔记:进阶】23.请介绍类加载过程,什么是双亲委派模型?
Java的类加载机制是JVM的核心组成部分,其过程分为三个阶段,并采用双亲委派模型来保证类加载的安全性和一致性。 1.类加载过程 1.加载阶段(Loading) 核心任务:查找并加载类的二进制字节流(如.class文件)。具体行为: 将字节码数据从不同数据源(如文件系统、网络等)读…...

25.4.30数据结构|并查集 路径压缩
书接上回 上一节:数据结构|并查集 前言 (一)理论理解: 1、在QuickUnion快速合并的过程中,每次都要找根ID,而路径压缩让找根ID变得更加迅速直接。 2、路径压缩 针对的是findRootIndex()【查找根ID】进行的压…...

MATLAB R2024a安装教程
安装步骤: 软件大小:约12.08G 安装环境:Win10~Win11或更高 下载好安装包,可以在网上找个安装包,比如我用国内镜像matlab地址github.com/futureflsl/matlab-chinese-mirror,这样下载稍微快点 1.开始安装…...
ag-grid-react 列表导出csv列表getDataAsCsv (自定义导出列表配置)自定义新增,修改导出内容
1.ag-grid-react getDataAsCsv 新增导出字段 方法:临时添加列再导出 你可以通过 columnApi.setColumnDefs() 临时添加需要导出的字段,然后再调用 getDataAsCsv,导出后再恢复原来的列。 import { useRef } from react; import { AgGridReac…...

WEB安全--社会工程--SET钓鱼网站
1、选择要钓鱼的网站 2、打开kali中的set 3、启动后依次选择: 4、输入钓鱼主机的地址(kali)和要伪装的网站域名: 5、投放钓鱼网页(服务器域名:80) 6、获取账号密码...

Java学习手册:Spring 数据访问
一、Spring JDBC JdbcTemplate :Spring JDBC 提供了 JdbcTemplate 类,它简化了数据库操作,提供了丰富的 API 来执行数据库访问任务。JdbcTemplate 可以自动处理数据库连接的获取、释放,SQL 语句的执行,结果集的处理等…...

linux 使用nginx部署next.js项目,并使用pm2守护进程
前言 本文基于:操作系统 CentOS Stream 8 使用工具:Xshell8、Xftp8 服务器基础环境: node - 请查看 linux安装node并全局可用pm2 - 请查看 linux安装pm2并全局可用nginx - 请查看 linux 使用nginx部署vue、react项目 所需服务器基础环境&…...

阿里云服务迁移实战: 07-其他服务迁移
概述 当完成了服务器、数据库、IP、OSS等迁移后,剩下的就是其他服务了。 短信网关 短信模板只能一个个创建,不能批量操作。但是可以使用以下方式优化操作。 在原账号导出模板列表 概述 当完成了服务器、数据库、IP、OSS等迁移后,剩下的…...

uniapp 实现低功耗蓝牙连接并读写数据实战指南
在物联网应用场景中,低功耗蓝牙(BLE)凭借其低能耗、连接便捷的特点,成为设备间数据交互的重要方式。Uniapp 作为一款跨平台开发框架,提供了丰富的 API 支持,使得在多个端实现低功耗蓝牙功能变得轻松高效。本…...