深入理解java虚拟机精华总结:jvm内存模型(运行时数据区域)、对象、OOM异常

news2024/11/15 10:52:53

深入理解java虚拟机精华总结:jvm内存模型、对象、OOM异常

  • jvm内存模型
  • 对象
    • 对象的创建
    • 对象的内存布局
    • 对象的访问定位
  • OOM异常
    • Java堆溢出
    • 栈溢出
    • 方法区溢出
    • 直接内存溢出

以前读过好几遍《深入理解java虚拟机》这本书,最近又打算重读一遍,并且做一些笔记,把重点内容记录下来,所以想开一个精华总结的系列,记录里面书中的重点内容。

jvm内存模型

java虚拟机在执行Java程序的过程中会把它管理的内存划分为不同的区域,每个区域都有各自的用途、创建和销毁的时间。

在这里插入图片描述

  • 程序计数器:当前线程所执行的字节码的行号指示器,每条线程都需要有一个独立的程序计数器(线程私有),不会发生OOM。
  • 虚拟机栈:线程私有,每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息,会抛出StackOverflowError和OutOfMemoryError异常。
  • 本地方法栈:与虚拟机栈相似,为本地方法的执行服务,会抛出StackOverflowError和OutOfMemoryError异常。
  • :线程共享,存放对象实例,大小可通过参数-Xmx和-Xms设定,会抛出OutOfMemoryError异常。
  • 方法区:线程共享,用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
  • 运行时常量池:方法区的一部分,用于存放在类加载后Class文件常量池表中的信息(各种字面量与符号引用)。
  • 直接内存:不是虚拟机运行时数据区的一部分,NIO使用Native函数库直接分配堆外内存,然后DirectByteBuffer对象作为这块内存的引用。

对象

对象的创建

在这里插入图片描述

对象创建过程

  1. new关键字。
  2. 判断类是否已经被加载、解析、初始化,如果没有,要先进行类加载。
  3. 为新生对象分配内存。内存划分的方式取决于内存是否绝对规整(看使用的垃圾收集器),如果内存规整则使用指针碰撞法进行内存分配,也就是指针向空闲方向挪动一段距离;如果内存不规整,则通过空闲列表法进行分配,也就是用一个列表记录内存空闲区域,分配内存时从中取出一块来分配。内存分配要保证线程安全,通过CAS或者TLAB(线程本地分配缓存)保证,TLAB就是线程的本地缓存区,先给一个线程分配一块固定大小的内存区域,然后该线程创建的对象在该本地缓存区中分配内存。
  4. 设置对象头,包括类元数据信息指针,hashcode等一些信息
  5. 执行构造函数

对象的内存布局

在这里插入图片描述

对象的内存布局划分为三个部分:对象头实例数据对齐填充

  • 对象头:存储Mark Word类型元数据指针,如果是数组则还有数组长度。Mark Word是对象自身的运行时数据(见上图表格),类型元数据指针指向该对象的类元数据信息。
  • 实例数据:存储对象的真实数据,也就是各种类型的字段。
  • 对齐填充:非必须,保证对象起始地址是8字节的整数倍。

对象的访问定位

两种访问方式:句柄访问直接指针访问

句柄访问方式:从堆中划出一块内存作为句柄池,reference指针存储句柄地址,需要两次寻址找到对象。

在这里插入图片描述

直接访问方式:reference指针直接指向对象实例,对象头中存储类型元数据的指针,速度快,节省一次寻址的开销。

在这里插入图片描述

OOM异常

在这里插入图片描述

Java堆溢出

java.lang.OutOfMemoryError: Java heap space

原因

  • 内存泄漏
  • 没有内存泄漏,堆内存太小

处理方法

  1. 过参数 -XX:+HeapDumpOnOutOf-MemoryError 让虚拟机在出现内存溢出异常的时候Dump出当前的内存堆转储快照。
  2. 通过内存映像分析工具对Dump出来的堆转储快照进行分析。
  3. 分清楚到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。
  4. 如果是内存泄漏,查看泄漏对象到GC Roots的引用链,找出产生内存泄漏的代码的具体位置。
  5. 如果不是内存泄漏,看是否还能调大堆参数(-Xmx与-Xms)的设置,减少其他对象的内存消耗。

栈溢出

java.lang.StackOverflowError

原因

  • -Xss 栈内存容量设置过小
  • 递归层数过大,压栈过深
  • 本地变量太多,栈帧太大

方法区溢出

java.lang.OutOfMemoryError: PermGen space

JDK 8以后,没有了永久代,改成在直接内存中的元空间,所以不会再出现。

原因

  • 运行时常量池溢出
  • 大量动态类(CGLib)
  • 大量JSP或动态产生JSP文件

直接内存溢出

java.lang.OutOfMemoryError

由直接内存导致的内存溢出,一个明显的特征是在Heap Dump文件中不会看见有什么明显的异常情况,如果内存溢出之后产生的Dump文件很小,而程序中又直接或间接使用了直接内存(典型的间接使用就是NIO),那就可以考虑重点检查一下直接内存方面的原因了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个接口多个实现如何选择注入对应的Bean_@Primary_@Resource_@Qualifier_@ConditionalOnProperty

文章目录引入结论案例Primary 指定默认注入的BeanQualifier配合Autowired 按名称注入对应的BeanResource 默认按照类型注入,可指定名称注入ConditionalOnProperty 结合配置文件统一设置bean的注入引入 在springboot中,如果一个接口有多个实现&#xff0…

SpringMVC - 13 - SpringMVC执行流程

文章目录1、SpringMVC常用组件2、DispatcherServlet初始化过程a>初始化WebApplicationContextb>创建WebApplicationContextc>DispatcherServlet初始化策略3、DispatcherServlet调用组件处理请求a>processRequest()b>doService()c>doDispatch()d>processDi…

【Neo4j】图数据库CypherQueryLanguage随笔

CQL语言随笔 一、Cyther关系描述 如图&#xff1a;唐僧&#xff0c;孙悟空&#xff0c;白骨精三者的关系图&#xff1a; Cypher语言描述他们的关系&#xff1a; (孙悟空)<-[:赶走]-(唐僧)-[:被骗]->(白骨精)-[:被打死]->(孙悟空) 二、CQL语言的使用案例 创建结点…

七、HTTPTomcatServlet

1&#xff0c;Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 在我们日常的生活中&#xff0c;经常会使用浏览器去访问百度、京东、传智官网等这些网站&#xff0c;这些网站统称为Web网站。如下就是通…

_react

React 中 keys 的作用是什么&#xff1f; Keys是 React 用于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识 在开发过程中&#xff0c;我们需要保证某个元素的 key 在其同级元素中具有唯一性。在 React Diff 算法中React 会借助元素的 Key 值来判断该元素是新近创建的还…

ADAS-可见光相机之Cmos Image Sensor

引言 “ 可见光相机在日常生活、工业生产、智能制造等应用有着重要的作用。在ADAS中更是扮演着重要的角色&#xff0c;如tesla model系列全车身10多个相机&#xff0c;不断感知周围世界。本文着重讲解下可见光相机中的CIS(CMOS Image Sensor)。” 定义 光是一种电磁波&…

如何在 iPhone 上恢复已删除的通话记录/通话记录

您的通话记录/通话记录可能很重要&#xff0c;尤其是当您想要拨打之前联系过但未保存的号码时。如果您碰巧删除了通话记录&#xff08;有意或无意&#xff09;&#xff0c;本指南将帮助您了解如何检索它们并找回您需要使用的所有记录。我们将根据您的情况和您拥有的工具讨论不同…

【Tomcat 】Tomcat 架构原理解析到架构设计借鉴

Tomcat 发展这么多年&#xff0c;已经比较成熟稳定。在如今『追新求快』的时代&#xff0c;Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』&#xff0c;难道说如今就没有必要深入学习它了么&#xff1f;学习它我们又有什么收获呢&#xff1f; 静下心来&#…

一文让你彻底理解关于消息队列的使用

一、消息队列概述 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ&#xff0c;Rabbit…

Spring Security认证研究

1.项目中认证的三种方式&#xff1a; 1.统一认证 认证通过由认证服务向给用户颁发令牌&#xff0c;相当于访问系统的通行证&#xff0c;用户拿着令牌去访问系统的资源。 2.单点登录&#xff0c;对于微服务项目&#xff0c;因为包含多个模块&#xff0c;所以单点登录就是使得用户…

烙铁使用方法

烙铁使用 烙铁是硬件工程师最经常使用的工具之一,一把性能保持良好的烙铁能帮助我们快速进行电路调试。烙铁第一次加热时采用焊锡均匀涂覆在烙铁头上,以便去除包在烙铁头上面的氧化物。在工作中我们需要根据情况选择合适的烙铁头类型,合适的温度进行操作。完成焊接后要在烙铁…

TypeError: load() missing 1 required positional argument: ‘Loader‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

BLIP2-图像文本预训练

文章目录摘要解决问题算法模型结构通过frozen图像编码器学习视觉语言表征图像文本对比学习&#xff08;ITC&#xff09;基于图像文本生成&#xff08;ITG&#xff09;图文匹配&#xff08;ITM&#xff09;从大规模语言模型学习视觉到语言生成模型预训练预训练数据预训练图像编码…

基础夯实,字节内部总结240道算法LeetCode刷题笔记,直呼太全

1、什么是算法算法(algorithm&#xff0c;[ˈlɡərɪəm]&#xff0c;计算程序)&#xff1a;就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c;并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤&#xff0c;用来将输入数据转化成输出结…

从Linux源码角度看套接字的Listen及连接队列

今天就从Linux源码的角度看下Server端的Socket在进行listen的时候到底做了哪些事情(基于Linux 3.10内核)&#xff0c;当然由于listen的backlog参数和半连接hash表以及全连接队列都相关&#xff0c;在这里也一块讲了。 Server端Socket需要Listen 众所周知&#xff0c;一个Serv…

archlinux docker配置php5.3

一直在维护一下10年前的老项目&#xff0c;是基于php5.3开发的。一直在使用windows虚拟机在开发php5.3。最近就想尝试在archlinux主系统中开发。 什么是php PHP 是一种广泛使用的通用脚本语言&#xff0c;特别适合 Web 开发&#xff0c;可以嵌入到 HTML 中。 AUR安装php5.3 …

【C语言进阶】了解计算机的程序环境和预处理过程 掌握计算机预处理操作

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C语言进阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.编译与链接1.1 程…

WebGPU学习(4)---使用 UniformBuffer

接下来让我们使用 UniformBuffer。UniformBuffer 是一个只读内存区域&#xff0c;可以在着色器上访问。 这次&#xff0c;我们将传递给着色器的矩阵存储在 UniformBuffer 中。演示示例 1.在顶点着色器中的 UniformBuffer 这次我们在顶点着色器里定义一个名为Uniforms的新结构体…

TCP 的演化史-sack 与 reordering metric

就着 TCP 本身说事&#xff0c;而不是高谈阔论关于它是如何不合时宜&#xff0c;然后摆出一个更务虚的更新。 从一个 case 开始。 按照现在 Linux TCP(遵守 RFC) 实现&#xff0c;以下是一个将会导致 reordering 更新的 sack 序列&#xff1a; 考虑一种情况&#xff0c;这两个…

【Spring】谈谈你对IOC和AOP理解(2023最新)

目录一.IOC(Inversion of Control)1.IOC是什么&#xff1f;2.IOC的实现原理二.AOP(Aspect Oriented Programming)1.AOP是什么&#xff1f;2.AOP的实现原理3.说一下AOP都有哪些基本理念&#xff1f;或者是AOP的术语4.Advice(通知)的类型有哪些5.AOP的应用场景6.使用AOP实例(日志…