Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JVM 中的内存溢出

JVM 中的内存溢出

作者头像
用户3596197
发布于 2019-04-25 06:26:46
发布于 2019-04-25 06:26:46
88200
代码可运行
举报
文章被收录于专栏:空帆船w空帆船w
运行总次数:0
代码可运行

内存溢出,通俗一点,就是 JVM 内存不足了,没有空闲内存,并且垃圾收集器也无法提供更多内存。

这里的意思是说,通常在抛出 OutOfMemoryError 之前,垃圾收集器会被触发,尽其所能去清理空间。

但也不是在所有情况下垃圾回收器都会被触发,比如分配了一个大对象,超过了堆的最大值,JVM 可能判断出垃圾收集并不能解决这个问题,直接抛出 OutOfMemoryError 。

JVM 内存结构 中,除了程序计数器,其他区域都有可能发生 OutOfMemoryError 。

1、堆溢出

通过-XmsXmx分别设定堆最小值和最大值。

错误信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.OutOfMemoryError: Java heap space

可能原因:

  • 内存泄漏
  • 堆的大小不合理,比如处理可观的数据量,但是没有显示指定 JVM 堆大小或者指定数值太小
  • JVM 处理引用不及时,导致堆积起来,内存无法释放

2、栈溢出

通过 --Xss 设置栈容量大小。

这里的栈包括虚拟机栈和本地方法栈。

比如递归操作,没有退出条件,会导致不断的压栈,JVM 就会抛出 StackOverFlowError。

如果 JVM 试图去扩展栈空间的时候失败,则会抛出 OutOfMemoryError。

3、方法区溢出

通过 -XX:PermSize-XX:MaxPermSize 限制方法区的大小。

String.intern() 的作用是:如果字符串常量池中已经包含一个等于此 String对象的字符串,则返回代表池中这个字符串的 String 对象,否则,将此 String 对象包含的字符串添加到常量池中,并且返回此 String 对象的引用。所以,当字符串缓存占用太多空间,也会导致 OOM 问题。

错误信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.OutOfMemoryError: PermGen space

JDK 1.7 后,方法区引入元数据区,元数据区默认自增,方法区内存不再那么窘迫。

元数据区错误信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.OutOfMemoryError: Metaspace

4、直接内存溢出

通过 -XX:MaxDirectMemorySize 指定直接直接内存容量大小。

特征:

Heap Dump 文件中不会看见明显的异常,如果 Dump 文件很小,程序中有使用 NIO,可以考虑检查是否是直接内存溢出。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JaqenTalk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java常见内存溢出异常分析
Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而内存模型中不同的部分都会出现相应的OOM错误,接下来我们就分开来讨论一下。 栈溢出(StackOverflowError) 栈溢出抛出java.lang.StackOverflowError错误,出现此种情况是因为方法运行的时候栈的深度超过了虚拟机容许的最大深度所致。 出现这种情况,一般情况下是程序错误所致的,
Java学习123
2018/05/16
1.3K0
关于JVM内存溢出的原因分析及解决方案探讨
当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出。
技术zhai
2019/08/18
2.2K0
Java内存溢出的几个区域,注意避坑
在开发过程中,时常会遇到内存溢出的问题,有可能是在生产环境,有的就在开发中,今天就聊一聊内存溢出。
小熊学Java
2023/07/16
2240
Java内存溢出的几个区域,注意避坑
JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
JVM参数官网 :http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
小小工匠
2021/08/17
6230
JVM: JVM 内存划分
https://www.cnblogs.com/paulwang92115/p/12251476.html
用户5224393
2020/03/10
8110
JVM: JVM 内存划分
一问带你彻底了解JVM-Java内存区域详解
Java内存模型在1.8之前和1.8之后略有不同,也就是运行时数据区域,请看如下图:
@派大星
2023/06/28
4620
一问带你彻底了解JVM-Java内存区域详解
Java 常见内存溢出异常与代码实现
Java 堆是用来存储对象实例的, 因此如果我们不断地创建对象, 并且保证 GC Root 和创建的对象之间有可达路径以免对象被垃圾回收, 那么当创建的对象过多时, 会导致 heap 内存不足, 进而引发 OutOfMemoryError 异常.
哲洛不闹
2018/09/14
7920
Java 常见内存溢出异常与代码实现
BAT面试必问题系列:深入详解JVM 内存区域及内存溢出分析
在JVM的管控下,Java程序员不再需要管理内存的分配与释放,这和在C和C++的世界是完全不一样的。所以,在JVM的帮助下,Java程序员很少会关注内存泄露和内存溢出的问题。但是,一旦JVM发生这些情况的时候,如果你不清楚JVM内存的内存管理机制是很难定位与解决问题的。
马士兵的朋友圈
2020/09/09
7510
java常见内存溢出(OOM)解决方案
-Xms ,-Xmx(heap memory space)堆空间:Heap是大家最为熟悉的区域,他是jvm用来存储对象实例的区域,Heap在32位的系统中最大为2G,其大小通过-Xms和-Xmx来控制,-Xms为jvm启动时申请的最小Heap内存,默认为物理内存的1/64,但小于1G,-Xmx为jvm可申请的最大的Heap内存,默认为物理内存的1/4,一般也小于1G,默认当空余堆内存小于40%时,jvm会最大Heap的大小到-Xmx指定大小,可通过-XX:MinHeapFreeRatio来指定这个比例,当空余堆内存大于70%时,JVM会将Heap的大小往-Xms指定的大小调整,可通过-XX:MaxHeapFreeRatio来指定这个比例,但通常为了避免频繁调整HeapSize的大小,将-Xms和-Xmx的值设为相同。
lyb-geek
2022/03/10
8830
【修订完善版】面试又被 JVM 内存区域虐了?推荐你看看这篇文章!
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
Guide哥
2020/05/08
4080
【修订完善版】面试又被 JVM 内存区域虐了?推荐你看看这篇文章!
Java 常见内存溢出异常与代码实现
Java 堆 OutOfMemoryError Java 堆是用来存储对象实例的, 因此如果我们不断地创建对象, 并且保证 GC Root 和创建的对象之间有可达路径以免对象被垃圾回收, 那么当创建的对象过多时, 会导致 heap 内存不足, 进而引发 OutOfMemoryError 异常. /** * @author xiongyongshun * VM Args: java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError */ public c
用户1212940
2018/01/23
7700
JVM参数详解及OOM
JVM参数 堆的限制 JVM中最大堆大小有三方面限制: 相关操作系统的数据模型(32-bt还是64-bit)限制 系统的可用虚拟内存限制 系统的可用物理内存限制 32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制 堆参数 -Xmx: 指定JVM的最大堆大小,如:-Xmx=2g -Xms: 指定JVM的最小堆大小,如:-Xms=2g,高并发应用,建议和-Xmx一样,防止因为内存收缩/突然增大带来的性能影响。 -Xmn: 指定JVM中NewGeneration的大小,如:-Xmn256m。这个参
用户1263954
2018/01/30
3.4K0
【JAVA】JVM 内存区域的划分
本博文将从内存管理的角度,进一步探索 Java 虚拟机(JVM)。垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得 JVM 内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是 Java 工程师进阶的必备能力。
sidiot
2023/08/31
2630
【JAVA】JVM 内存区域的划分
【原创】面试官:JVM内存区域你了解吗?
JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【Java 堆、方法区】、直接内存。
良月柒
2020/04/14
5060
【原创】面试官:JVM内存区域你了解吗?
深入理解Java中的内存溢出内存溢出内存溢出的几种情况(OOM 异常)导致内存溢出的原因内存溢出的解决方法
OutOfMemoryError 异常: 除了程 序计数器外 , 虚拟机内 存的其他几 个运行时区 域都有发生OutOfMemoryError(OOM)异常的可能。
desperate633
2018/08/22
2.8K0
谈谈JVM内存区域的划分,哪些区域可能发生 OutOfMemoryError?
首先,程序计数器(PC,Program Counter Register)。在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地方法,则是未指定值(undefined)。
葆宁
2019/04/18
7810
谈谈JVM内存区域的划分,哪些区域可能发生 OutOfMemoryError?
深入理解 JVM 之——Java 内存区域与溢出异常
本篇为深入理解 Java 虚拟机第二章内容,推荐在学习前先掌握基础的 Linux 操作、编译原理、计算机组成原理等计算机基础以及扎实的 C/C++ 功底。
浪漫主义狗
2023/09/04
3380
深入理解 JVM 之——Java 内存区域与溢出异常
Java 内存区域详解
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
Vincent-yuan
2021/10/26
4960
关于JVM内存的N个问题
JVM的内存划分中,有部分区域是线程私有的,有部分是属于整个JVM进程;有些区域会抛出OOM异常,有些则不会,了解JVM的内存区域划分以及特征,是定位线上内存问题的基础。那么JVM内存区域是怎么划分的呢?
Tencent JCoder
2018/10/09
5490
关于JVM内存的N个问题
JVM内存结构探秘及编码实战
在Java的开发过程中,因为有JVM自动内存管理机制,不再需要像在C、C++开发那样手动释放对象的内存空间,不容易出现内存泄漏和内存溢出的问题。但是,正是由于把内存管理的权利交给了JVM,一旦出现内存泄漏和内存溢出方面的问题,如果不了解JVM是如何使用内存的,不了解JVM的内存结构是什么样子的,就很难找到问题的根源,就更难以解决问题。
万猫学社
2022/04/22
3520
JVM内存结构探秘及编码实战
相关推荐
Java常见内存溢出异常分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验