jvm的OOM

2024-08-25 13:18
文章标签 java jvm oom

本文主要是介绍jvm的OOM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    在jvm内存模型中,除了程序计数器,其他区域都可能出现内存溢出问题。什么叫内存溢出呢?在程序运行过程中,当内存已扩展到最大,无法动态扩展,而又有新对象需要分配内存的时候,出现的内存空间不足的问题,叫做内存溢出。

    关于内存溢出和内存泄漏,两个概念,它们有什么区别?

    它们两个的表现都是内存不够用了。区别是造成内存不够的原因不同。

    内存泄漏(Memory Leak)是指内存中有无用的对象堆积,GC无法清除,致使空间不足。在使用引用计数法标记垃圾对象的时候,容易出现循环引用的情况,致使这些垃圾对象无法被GC清除,会出现内存泄漏。

    内存溢出(Memory Overflow)是指内存中对象都是必须要存在的,而有新对象申请内存,内存却不够分了,这种情况就是内存溢出。

    哪块儿内存区域可能会发生内存溢出?报的异常分别是什么?什么样的代码会导致此区域内存溢出?如何解决或者避免这些内存溢出问题?下面分别来总结一下。

    “java.lang.OutOfMemoryErro:Java heap space”,这个异常信息,大家在写代码的时候应该都遇到过。以冒号为分界,前半部分是异常种类,表示内存溢出。后半部分表示异常发生的区域。除了上边的堆区,还有下面几种: "unable to create new native thread","PermGen space","(Native Method)"。可以很容易的和前边讲的java内存模型对应起来,分别是栈、永久代。最后一个不是jvm内存中,它是本机直接内存DirectMemory。

    

    //TODO:什么样的代码会导致此区域内存溢出?

    堆溢出:

    栈溢出:虚拟机栈/本地方法栈溢出。

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

    本机直接内存溢出:

    

    如何解决或者避免这些内存溢出问题?第一步的,虚拟机做了处理,那就是垃圾回收机制。第二步的,我们的应用程序中可能会因为代码写的有问题造成内存溢出。这就需要排查出有问题的代码在哪里,从而修改它。如何排查问题,我们可以借助java提供的一些工具。对堆栈进行分析。步骤大致如下:

    1、先通过内存映像分析工具(如Eclipse Memory Analyzer)对Dump出来的堆转储快照进行分析。看是内存泄漏还是内存溢出。

    2、若是内存泄漏,就通过工具去查看泄漏对象到GC Roots的引用链,看它们是如何关联上的。这样定位泄漏代码的问题,再去解决具体的问题。(GC Roots是应用的可达性分析的方法来确定对象是否使用,若从GC Roots出发,通过引用链能到达的对象是可达对象,也就是对程序来说有用的对象,反之,不可达就是垃圾对象,需要被垃圾收集器回收的)

    3、若是内存溢出,再去看参数,看相应的区域是否还可以调大。或者看代码,是否有占用生命周期过长的情况。以堆区为例,若发生溢出,去看-Xmx与-Xms,去和机器物理内存对比,是否可调大。


    关于工具如何使用,请关注后续的文章。


    通过常见的内存溢出情况,反推代码写就时应该注意的问题,从而避免溢出的发生:

    1、避免创建周期过长的对象。??

    2、避免递归调用的深度过长。??


总结:

    讲了一下内存溢出发生的几种情况。异常信息分别是什么。GC的存在是为了对垃圾对象进行回收,也就避免了内存溢出问题。

    理论和实践相结合,理论指导实践,而实践能更好的理解理论。


这篇关于jvm的OOM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105658

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件