当前位置: 首页 > backend >正文

【学习笔记】深入理解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关键字

http://www.xdnf.cn/news/3595.html

相关文章:

  • C++析构函数详解
  • Socat 用法详解:网络安全中的瑞士军刀
  • 部署Superset BI(一)试水
  • 非对称加密算法(RSA、ECC、SM2)——密码学基础
  • 2025年- H18-Lc126-54.螺旋矩阵(矩阵)---java版
  • 【阿里云大模型高级工程师ACP习题集】2.9 大模型应用生产实践(上篇)
  • Android学习总结之jetpack组件间的联系
  • HTTP和HTTPS
  • IntelliJ IDEA
  • 微信小程序
  • Python集合全解析:从基础到高阶应用实战
  • 信息收集新利器:SSearch Chrome 插件来了
  • 如何理解 MCP 和 A2A 的区别?|AI系统架构科普
  • B站Michale_ee——ESP32_IDF SDK——FreeRTOS_5 事件组同步与等待
  • 驱动开发系列56 - Linux Graphics QXL显卡驱动代码分析(三)显示模式设置
  • wpf 输入框 在输入时去除水印
  • 开闭原则与依赖倒置原则区别:原类不变,新增类(功能)vs 接口类不变,原实现类可变
  • 十分钟用Docker搭建功能齐全的Poste.io邮件服务器
  • 分布式理论:常见分布式协议的概览与解析
  • 原地轮转数组的两种高效实现详解
  • 使用 Java 实现一个简单且高效的任务调度框架
  • HTTPS协议:更安全的HTTP
  • Qt通过QXlsx库文件写入到excl文件,读取excl文件
  • PowerBI实现点击空白处隐藏弹窗(详细教程)
  • pip 常用命令及配置
  • Linux发展史、开源文化与技术生态全景
  • 10 种微服务设计模式
  • python实现基于Windows系统计算器程序
  • 【Linux】Linux奇技淫巧
  • 【AI论文】Sadeed:通过小型语言模型推进阿拉伯语变音