Java内存区域

2023-11-19

Java内存区域

《深入理解Java虚拟机(第2版)》

Java虚拟机在执行Java程序的过程中会把它所管理的内存分为若干个不同的数据区域。

Java虚拟机运行时数据区

这里写图片描述
其中蓝色部分为共享区域,浅色部分为各线程私有。

程序计数器

一块较小的区域,可以看做是当前线程所赤星的字节码的行号指示器。

可以通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程回复等基础功能都需要依赖这个计数器来完成。

如果线程执行的是一个Java方法,计数器记录的是正在执行的字节码指令的地址;如果执行的Native方法,则计数器值为空(Undefine)。

此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

Java虚拟机栈(栈)

描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈和出栈的过程。

存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用returnAddress类型(执行了一条字节码指令的地址)。

在Java虚拟机规范中,对这个区域规定了两种异常情况:
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可以扩展),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

本地方法栈

与虚拟机栈发挥的作用非常相似,只是本地方法栈为虚拟机使用到的Native方法服务,而虚拟机栈为Java方法服务。

与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

Java堆

对于大多数应用来说,Java 堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动的时创建。所有的对象实例以及数组都要在这里分配内存(随着JIT编译器的发展与逃逸分析技术的成熟,也不是那么绝对了)。

Java堆是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”(Garbage Collected Heap)。

由于现在收集器基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代

如果在堆中没有内存完成实例的分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

方法区

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

如果方法区的内存空间不能满足内存分配需要时,将抛出OutOfMemoryError异常。

运行时常量池

是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

常量也不一定只有编译器才能产生(即并非预置入Class文件中常量池的内容才能进入方法去运行时常量池),运行期间也可能将新的常量放入池中,这种特性被利用的比较多的就是String类的intern()方法。

直接内存

直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。但是这部分内存也被频繁使用,而且也可能导致OutOfMemoryError异常出现。

异常抛出

Java堆溢出

List<Object> list = new ArrayList<>();
while(true) {
    list.add(new Object());
}

虚拟机栈溢出

private int stackLength = 1;
public void statckLeak() {
    stackLength++;
    stackLeak();
}


stackLeak();

方法区和运行时常量池溢出

List<String> list = new ArrayList<>();
int i = 0;
while(true) {
    list.add(String.valueOf(i++).intern());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java内存区域 的相关文章

  • 声纳违规:安全性 - 使用 byte[] 时直接存储数组

    我确实遇到过以下两篇关于类似问题的帖子声纳违规 https stackoverflow com questions 11580948 sonar violation security array is stored directly and
  • 将 CSV 文件读入 Java 作为数据库表

    我发现了很多关于使用 Java 读取 CSV 的帖子 并且他们所指向的 API 在读取 CSV 文件时都采用了面向行的方法 就像 当你得到一行时 获取每一列的值 我希望有一个更高级别的 API 比如在 Perl 中 DBI 允许您在 CSV
  • Antlr 处理异常

    我使用 Antlr 3 和 AST 树开发了一个复杂的语法 ANTLR 生成词法分析器和解析器 问题是 例如 当用户输入无效的语法时 该语法需要 用户没有输入此内容 然后在我的 Eclipse IDE 中出现以下异常 line 1 24 m
  • Selenium webdriver :列表不是通用的;它不能使用参数 `` 类型进行参数化

    我试图将链接存储在列表中 请按照以下代码操作 public class frameswitch public static void main String args System setProperty webdriver gecko d
  • Java 弱哈希映射 - 需要根据值的弱点而不是键来删除条目

    所以JavaWeakHashMap让我们创建一个映射 如果其键变弱 则删除该映射的条目 但是我怎样才能创建一个Map 当它的条目被删除时values地图上变弱了 我想使用映射的原因是作为全局哈希表 它根据对象的 ID 跟踪对象 ID gt
  • 包含小时、分钟和秒的周期[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个代表年 月 周 日 小时 分钟 秒的间隔数据类型 前三年 年 月 日 可以用Period最后
  • 如何使用 Spring Security 跨多个基于 JVM 的应用程序实现单点登录

    我目前正在尝试跨多个基于 JVM Grails Servlet 的 Web 应用程序实现单点登录解决方案 这些应用程序目前都部署在同一个 servlet 容器 当前是 Tomcat 但不想将我的解决方案仅限于 Tomcat 中 所有 Web
  • 如何在 Java 中安装附加包?

    我对 Java 很陌生 我想使用名为的包中的一些功能daj 教程代码有以下几行 import daj import java util import java lang Math import Msg 但第一行和第四行会产生红色下划线 导致
  • 可以向 @ManyToMany Hibernate 额外表添加额外字段吗?

    我有这两类 表 Entity Table name course public class Course Id Column name courseid private String courseId Column name coursen
  • Java 中的本机方法

    我花了一些时间学习什么是 Java Native 方法以及它们是在平台相关代码 主要是 C 中实现的 但是我在哪里可以找到这些 Java 的本机实现呢 例如 Thread 类的 sleep long millis 方法是本机的 但它的实现代
  • 将二进制数据的 byte[] 转换为 String

    我有二进制格式的数据 hex 80 3b c8 87 0a 89 我需要将其转换为字符串 以便通过 Jackcess 将二进制数据保存在 MS Access 数据库中 我知道 我不打算在 Java 中使用 String 来存储二进制数据 但
  • 如何在 Ivy 中使用不同的分类器下载多个 Maven 依赖项?

    我试图依靠Neo4j 服务器 jar http repo neo4j org content repositories snapshots org neo4j app neo4j server 1 5 SNAPSHOT neo4j serv
  • kafka Avro 多个主题的消息反序列化器

    我正在尝试以 avro 格式反序列化 kafka 消息 我使用以下代码 https github com ivangfr springboot kafka debezium ksql blob master kafka research c
  • 如何减少 JSF 中的 javax.faces.ViewState

    减少 JSF 中视图状态隐藏字段大小的最佳方法是什么 我注意到我的视图状态约为 40k 这会在每次请求和响应时下降到客户端并返回到服务器 特别是到达服务器时 这对用户来说会显着减慢 我的环境 JSF 1 2 MyFaces Tomcat T
  • 日志记录在 Android 设备上实际上有什么作用?

    我一直在 Android 示例中看到这样的代码 try catch Exception e Log e Error e getMessage 什么是Log e实际上在物理设备上做什么 它进入系统日志 开发人员可以通过 SDK 工具访问该日志
  • 为什么jdk中没有ConcurrentLinkedHashMap类?

    这个问题直接接着问从我之前的问题来看 https stackoverflow com q 12299731 1527084 我想我的第二个问题的答案是否定的 所以我想了解为什么 java util concurrent 包中没有 Concu
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ
  • Maven `help: effective-pom` 只为单个项目生成,而不是所有项目

    我想为多模块构建中的所有子项目生成有效的 pom The help effective pom文档here http maven apache org plugins maven help plugin usage html The hel
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我

随机推荐

  • Python基础知识(四):一文看懂列表、元组和字符串操作

    序列 序列是具有索引和切片能力的集合 列表 元组和字符串具有通过索引访问某个具体的值 或通过切片返回一段切片的能力 列表 元组 字符串都属于序列 1 列表 列表 List 是Python中非常重要的内置数据类型 列表由一系列元素组成 所有的
  • 设计模式——简单工厂模式

    简单工厂模式定义为 简单工厂模式又称为静态工厂方法模型 它属于类创建型模式 在简单工厂模式中 可以根据参数的不同返回不同类的实例 简单工厂专门定义一个类来负责创建其他类的实例 被创建的实例通常都具有共同的父类 简单工厂模式结构图 简单工厂模
  • Picture控件的加载图像的使用总结

    一 非动态显示图片 即图片先通过资源管理器载入 有一个固定ID 二 动态载入图片 即只需要在程序中指定图片的路径即可载入 为方便说明 我们已经建好一个基于对话框的工程 名为Ttest 对话框类为CTestDlg 一 vc picture控件
  • kettle抽取数据判断是否有数据

    kettle分为两种对象 一种是作业 另一种是转换 判断是否有数据 在作业中实现即可 第一步 文件 gt 新建 gt 作业 第二步 右边有主对象树和核心对象 选择核心对象 第三步 选择条件 gt 计算表中的记录数 第四步 双击此对象 计算表
  • 前端摸鱼日记(一)

    一会又要开周五的工作总结会 一天天真闲的 此处省略一万个草 上个月招来一个技术经理 文文雅雅的 是什么也不干 看起来什么都不会 每周五就假装来开个会 真他妈无语了 实在无聊 写个日志 自从创立武当山教学院 目前只有四个人 刘大目前在武当山自
  • 详解Arduino Uno开发板的引脚分配图及定义(重要且基础)

    详解Arduino Uno开发板的引脚分配图及定义 重要且基础 https www cnblogs com Bruce H21 p 11555605 html 首先开发板实物图如下 在本篇文章中 我们将详细介绍Arduino开发板的硬件电路
  • 解决vue路由跳转到同一页面的刷新问题

    问题描述 当我使用路由跳转页面时 如果页面跳转是同一个路由 传递的参数不同时 页面不刷新 如下图 待收定金和待收首款其实跳转的是同一个组件 只是他们传递的参数不同而已 当我使用路由进行跳转时 我发现第一次是可以正确跳转的 比如我当前在其他页
  • qt中获取窗口位置和大小

    窗口左上角的位置 含边框 qDebug lt lt this gt frameGeometry x lt lt this gt frameGeometry y lt lt 1 qDebug lt lt this gt x lt lt thi
  • Ubuntu系统下常用的新建、删除、拷贝文件命令

    常用新建 删除 拷贝命令 mkdir 目录名 新建一个文件夹 文件夹在Linux系统中叫做 目录 touch 文件名 新建一个空文件 rmdir 目录名 删除一个空文件夹 文件夹里有内容则不可用 rm rf 非空目录名 删除一个包含文件的文
  • 【C语言】_4.数组

    目录 1 一维数组 2 二维数组 3 数组越界 4 数组作为函数参数 正文 1 一维数组 1 1 数组的创建 1 数组的概念 数组是一组相同类型元素的集合 2 数组的创建方式 type t arr name const n 即数组元素类型
  • AMD yes!拿下Meta后发布新芯片,FP64性能是A100 4.9倍,面向高性能计算和机器学习...

    明敏 发自 凹非寺量子位 报道 公众号 QbitAI AMD造势已久 面向高性能计算的MI200 终于来了 在拿下元宇宙大客户Meta后 AMD乘势而上官宣一系列新芯片 其中就包括这张不断有消息曝出的计算加速卡 它采用6nm工艺 拥有580
  • 第15课 微信小程序behavior组件间的数据共享:

    第15课 微信小程序behavior组件间的数据共享 先看看目录结构 我们先编写一下两my behavior的代码 这里是my behavior js的代码 behavior内还可以嵌套引入behavior my behavior js 引
  • 嵌入式学习:stm32学习路线推荐之思维导图

    从9月1日开始学习STM32后 对于STM32的一些个人总结 1 对于STM32和51的区别 对于 STM32来说 基本的大概都和51单片的内容相似 但是由于STM的引脚和寄存器的数量较多 所以需要一个更加完善的管理机制 导致了 时钟 的产
  • Caused by: org.attoparser.ParseException: Error resolving template [index], template might not exist

    仿牛客论坛 th replace index header 报错 index html中 th fragment header register html中 th replace index header 主要报错是两个 org thyme
  • 递归算法——八皇后问题 python

    研究了一下午的八皇后算法 可算是搞明白了 为了避免以后忘记 还是写个博客吧 可能会跟其他文章有相似之处 最终还是希望能好好学习算法 都是经过自己思考后亲自写的代码 虽然过程比较艰难 我写了很多注释 参考B站视频链接 2021第十二届蓝桥杯青
  • 前端移动Web第四天案例:阿里百秀首页-响应式布局(bootstrap框架)

    阿里百秀首页案例 技术选型 方案 我们采取响应式页面开发方案 技术 bootstrap框架 设计图 本设计图采用 1280px 设计尺寸 1 页面布局分析 2 屏幕划分分析 屏幕缩放发现 中屏幕 和 大屏幕布局 是一致的 因此我们列 定义为
  • Matlab实现蚂蚁群算法(附上多个完整仿真源码)

    蚂蚁群算法是一种模拟自然界中蚂蚁行为的优化算法 其具有全局搜索能力和适应性强的特点 被广泛应用于组合优化问题中 本文将介绍如何使用Matlab实现蚂蚁群算法 文章目录 1 蚂蚁群算法原理 2 Matlab实现蚂蚁群算法 3 代码实现 4 结
  • JS常用方法总结

    数组常用的方法 方法 语法 描述 增加方法 splice arr splice 起始下标 长度 添加的元素1 元素2 arr splice 3 0 0 1 xiaolv 从数组中添加或删除元素 push arr push xiaonan v
  • 数据库双服务器系统设计,面向数据库服务器的高可用性系统的设计与实现

    摘要 随着计算机技术的飞速发展 数据库的应用已遍及各行各业 它们往往维系着整个系统的生命 一旦数据库崩溃造成数据丢失或者暂停服务 那将给用户或企业带来不可估量的损失 尤其是银行系统与电子商务交易系统 一些不可预料的故障或停机造成的经济损失可
  • Java内存区域

    Java内存区域 深入理解Java虚拟机 第2版 Java虚拟机在执行Java程序的过程中会把它所管理的内存分为若干个不同的数据区域 Java虚拟机运行时数据区 其中蓝色部分为共享区域 浅色部分为各线程私有 程序计数器 一块较小的区域 可以