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

IT乐知 2021-02-23 15:49:00
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 在相同物理内存下,减小这个值能成更多的线程.但是操作系统对1个进程内的线程数还是有限制的,不能无限生成

 

出现栈溢出可能原因:

递归:递归里用到的局部变量存储在堆栈中,堆栈的访问效率高,速度快,但空间有限,递归太多变量需要一直入栈而不出栈,导致需要的内存空间大于堆栈的空间,栈空间是2M,堆空间内存空间。

 

运行时常量溢出(constant)

运行时常量保存在方法区,存放的主要是编译器生成的各种字面量和符号引用,但是运行期间也可能将新的常量放入池中,比如String类的intern方法。如果该区域OOM,错误结果会包含类似下面的信息:

1 java.lang.OutofMemoryError: PermGen space

相关的JVM参数有:

1 -XX:PermSize:设置持久代(perm gen)初始值,默认值为物理内存的1/64

2 -XX:MaxPermSize:设置持久代最大值,默认为物理内存的1/4

 

方法区溢出

方法区主要存储被虚拟机加载的类信息,如类名、访问修饰符、常量池、字段描述、方法描述等。理论上在JVM启动后该区域大小应该比较稳定,但是目前很多框架,比如Spring和Hibernate等在运行过程中都会动态生成类,因此也存在OOM的风险。如果该区域OOM,错误结果会包含类似下面的信息:

java.lang.OutofMemoryError: PermGen space

相关的JVM参数有:

1 -XX:PermSize:设置持久代(perm gen)初始值,默认值为物理内存的1/64

2 -XX:MaxPermSize:设置持久代最大值,默认为物理内存的1/4 

 

更多Java面试题,可搜索小程序:IT面试题练习

版权声明
本文为[IT乐知]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4585596/blog/4960635

  1. docker入门到熟练
  2. Java之HTTP网络编程(一):TCP/SSL网页下载
  3. Introduction to docker
  4. HTTP network programming in Java (1): TCP / SSL web page download
  5. mysql 的ACID以及隔离级别
  6. Acid and isolation level of MySQL
  7. Java序列化对字段名的影响
  8. The influence of Java serialization on field names
  9. Redis 日志篇:系统高可用的杀手锏
  10. Java中把一个对象复制给另外一个对象引发的思考
  11. Java之HTTP网络编程(一):TCP/SSL网页下载
  12. Redis log: the killer of system high availability
  13. Thinking about copying one object to another in Java
  14. HTTP network programming in Java (1): TCP / SSL web page download
  15. 数据库--oracle安装配置(本地安装的步骤及各种问题解决方案)
  16. 从事Java9年,27天熬夜把近年遇到的面试题收录成册全网开源!
  17. Database -- Oracle installation configuration (local installation steps and various problem solutions)
  18. Engaged in Java for 9 years, 27 days stay up late, the interview questions encountered in recent years included into a volume, the whole network open source!
  19. Java序列化 / 调用 Wildfly 服务接口异常:EJBCLIENT000409
  20. docker-compose部署Estack
  21. Redis 日志篇:系统高可用的杀手锏
  22. Java中把一个对象的值复制给另外一个对象引发的思考
  23. Java serialization / call wildfly service interface exception: ejbclient000409
  24. Docker compose deploy stack
  25. Mac下查看已安装的jdk版本及其安装目录
  26. Redis log: the killer of system high availability
  27. mybatis映射xml配置文件报错:<statement> or DELIMITER expected, got ‘id‘
  28. Thinking about copying the value of one object to another in Java
  29. IntelliJ IDEA 还能画思维导图,果然最强 IDE!
  30. vue使用sdk进行七牛云上传
  31. IntelliJ IDEA 还能画思维导图,果然最强 IDE!
  32. Spring原来还可以这么玩!阿里新产Spring全线宝典成功颠覆了我对Spring的认知!
  33. View the installed JDK version and its installation directory under mac
  34. Error in mybatis mapping XML configuration file: < statement > or delay expected, got 'ID‘
  35. IntelliJ IDEA 还能画思维导图,果然最强 IDE!
  36. Javascript性能优化【内联缓存】 V8引擎特性
  37. IntelliJ idea can also draw mind maps. It's really the strongest ide!
  38. Vue uses SDK to upload Qi Niu cloud
  39. IntelliJ idea can also draw mind maps. It's really the strongest ide!
  40. 深入理解 Web 协议 (三):HTTP 2
  41. Spring can still play like this! Ali's new spring product has successfully overturned my understanding of spring!
  42. IntelliJ idea can also draw mind maps. It's really the strongest ide!
  43. JavaScript performance optimization [inline cache] V8 engine features
  44. linux 配置java环境
  45. linux find 查找文件
  46. 深入理解 Web 协议 (三):HTTP 2
  47. IntelliJ IDEA 相关问题记录
  48. Deep understanding of Web protocol (3): http 2
  49. 深入理解 Web 协议 (三):HTTP 2
  50. 腾讯IEG开源AI SDK:自动化测试吃鸡、MOBA类游戏
  51. Mysql Command
  52. Configuring Java environment with Linux
  53. Find files in Linux
  54. docker-Dockerfile 创建镜像
  55. Redis Cluster
  56. 深入理解 Web 协议 (三):HTTP 2
  57. JavaScriptBOM操作
  58. JavaScriptBOM操作
  59. Deep understanding of Web protocol (3): http 2
  60. Record of IntelliJ idea related problems