【Java面试题第三期】JVM中哪些地方会出现内存溢出?出现的原因是什么?

本文介绍了Java中可能导致内存溢出的区域,包括堆、栈、运行时常量和方法区。堆溢出通常由于内存泄露或分配过大对象引起,栈溢出可能源于递归深度过大,运行时常量溢出与常量池容量有关,而方法区溢出则与动态生成类的数量增加有关。理解这些原因有助于优化Java应用和避免内存问题。
摘要由CSDN通过智能技术生成

Java面试题

​ ​内存溢出(Out Of Memory)经常简称为OOM,在jvm中主要分为方法区、堆、栈、本地方法栈、程序计数器这几部分,其中程序计数器是唯一不会出现OOM的,也就是说其他区域都会出现OOM。下面来分别说明几个区域出现OOM的情况及特征。

1. java堆溢出(heap)

Java堆内存主要用来存放运行过程中所有的对象,该区域OOM异常一般会有如下错误信息:

java.lang.OutofMemoryError:Java heap space

可以通过dump的内存快照就能分析,到底是由于程序原因导致的内存泄露,还是由于没有估计好JVM内存的大小而导致的内存溢出。

2. 栈溢出(stack)

栈用来存储线程的局部变量表、操作数栈、动态链接、方法出口等信息。如果请求栈的深度不足时抛出的错误会包含类似下面的信息: java.lang.StackOverflowError。

由于每个线程占的内存大概为1M,因此线程的创建也需要内存空间。如果申请创建的线程比较多超过剩余内存的时候,也会抛出如下类似错误:java.lang.OutofMemoryError: unable to create new native thread

与栈相关的JVM参数有:

1、 -Xss: 每个线程的堆栈大小,JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.

2、 在相

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值