JVM学习随笔02——虚拟机内存区组成与内存溢出异常

news/2024/10/31 5:30:18/

一、Java虚拟机内存区组成图

 1、程序计数器:

  • 每个线程独占一个计数器,用来指示该线程下一条要执行的指令的地址。
  • 这一部分不会导致内存异常。
  • PS:如果一个线程进入的是一般的Java方法,计数器指示的是下一条指令地址;如果进入的是Native方法(非Java代码)计数器为空undefined。

2、虚拟机栈:

  • 线程私有,用来存储正在执行的Java方法的局部变量表、连接、方法出口等等信息。一个Java方法从开始执行到执行结束对应一个栈帧入栈到出栈的过程。
  • 局部变量表是虚拟机栈中最主要的部分,局部变量表里存储了线程对应代码编译期间确定下的所有数据类型和对象引用,局部变量表的slot个数编译后就完全确定了,运行期间slot个数不会改变。
  • 如果JVM提前规定了栈深度(可以简单理解为slot个数),线程需要的深度如果大于该值,会爆栈,抛出StackOverflowError异常;
  • 如果JVM栈深度是动态扩展的,那一直到虚拟机栈内存全部用完,然后抛出O.O.M异常。

3、本地方法栈:

  • 和虚拟机栈类似,只不过虚拟机栈为普通Java方法(字节码)服务,本地方法栈为Native方法服务。

4、堆(GC堆、“垃圾堆”):

  • 所有线程共享;存放几乎所有的对象实例;
  • 和前面的栈一样,Java堆既可以是固定大小的,也可以是可扩展的,一般可扩展(对应参数-Xms、-Xmx)。
  • 堆空间不够抛出O.O.M异常。

5、方法区(非堆):

  • 所有线程共享;用来存放一些已经被JVM加载的常量、静态变量等数据。
  • 方法区空间不足时抛出O.O.M异常;

PS:程序中的常量不一定在编译器全部加入运行时常量池,运行过程中产生的常量也可以加入常量池中。代码运行过程中产生常量的例子如:String类的intern()函数,intern()函数在JDK1.7之前和之后以及JDK1.8中好像均有区别,具体内容可以参考博客:字符串的intern()方法--字符串常量池_字符intern_JnHaLee的博客-CSDN博客

6、直接内存:

        资料上说直接内存不属于虚拟机运行时数据区的一部分,不是很理解前面这句话...但能确定的是在根据物理机内存确定JVM所需内存空间时要把这一部分占用的空间也考虑上。

参考资料:《深入理解Java虚拟机:... 第3版》周志明


http://www.ppmy.cn/news/60331.html

相关文章

知识变现海哥|知识付费 VS 知识免费

知识付费 VS 知识免费 1 大家好,我是海哥,知识变现创业教练,头部教育公司内容总监,海哥知识变现学院创始人,海哥知识变现星球主理人。从事知识变现创业10年,已助力3000人实现知识变现,曾凭一套…

Dubbo源码篇02---从泛化调用探究Wrapper机制的原理

Dubbo源码篇02---从泛化调用探究Wrapper机制的原理 什么是泛化调用从传统三层架构说起反射调用尝试优化 泛化调用泛化调用怎么用通过Spring使用泛化调用 利用泛化调用改造现有服务 泛化调用小结 Wrapper机制自定义代理dubbo底层wrapper原理小结 小结 什么是泛化调用 从传统三层…

#杂谈 个人嵌入式开发的学习

本人目前从事的是嵌入式软件开发的相关工作。这是一个关于个人做项目时用过的开发工具的杂谈,仅是为了记录学习经历,同时也为和我有同样瞎搞东西的爱好者提供一个学习思路。 前言 我的技术栈: 下面介绍一下我用过在或者还在用的开发工具&…

移动web一 屏幕适配

代码下载 相对单位 em&#xff1a;相对于父元素字体大小 rem&#xff1a;相对于html元素字体大小&#xff08;优点是通过修改html字体大小使页面元素大小得到整体控制&#xff09; <body><div><p></p></div> </body><style>html…

最佳Midjourney动漫相关风格提示词,值得收藏

先补充概念&#xff0c;后面慢慢补图片咯 动漫艺术家 下面是一些最伟大的艺术家的名单 Hayao Miyazaki, Co-founder of Studio Ghibli&#xff08;宫崎骏&#xff0c;吉卜力工作室的共同创始人&#xff09;Eiichiro Oda, One Piece&#xff08;织田荣一郎&#xff0c;《海贼…

shared_ptr 的线程安全性

多线程环境下&#xff0c;调用不同的 shared_ptr 实例的成员函数是不需要额外的同步手段的&#xff0c;即使这些 shared_ptr 管理的是相同的对象。 多线程对于同一个 shared_ptr 实例的读操作&#xff08;访问&#xff09;可以保证线程安全&#xff1b;但对于同一个 shared_ptr…

用@Value注解为bean的属性赋值

1.Value注解 Value注解的源码&#xff0c;如下所示 Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface Value {String value(); }从Value注解的源码中…

尚品汇api(后台)接口文档

1.1 服务器地址 开发服务器 http://gmall-h5-api.atguigu.cn&#xff08;新的&#xff09; 1.2 公共请求参数 每个接口需要的Header参数值&#xff08;登录接口不需要&#xff09;&#xff1a; 参数名称 类型 是否必选 描述 token String Y 登录的token user…