JVM内存
Heap:
Eden Space
Survivor Space
Old Gen
NonHeap:
Code Cache
Metaspace
Compressed Class Space
PC程序计数器是JVM运行时数据区 Runtime Data Area 唯一没有OOM的区域;
发生OOM时,通常会指明,发生异常的区域,如:
Exception in thread thread_name:java.lang.OutOfMemoryError:[1-8]
- Java heap space 堆空间
- Xmx 堆内存 最大值 - Xms 堆内存 初始值
- GC Overhead limit exceeded GC过于频繁
1.增加参数,-XX:-UseGCOverheadLimit,关闭这个特性,同时增加heap大小,-Xmx1024m。 2.排查并优化消耗内存资源代码.
- Requested array size exceeds VM limit 尝试分配过大的数组
- Metaspace 元空间
- request size bytes for reason. Out of swap space?
- Compressed class space
- reason stack_trace_with_native_method
PermGen space- XX:PermSize 持久代 初始值 - XX:MaxPermSize 持久代 最大值
java.lang.StackOverflowError
栈溢出;
每个线程都有私有栈内存,当调用一个方法时,都会创建栈桢,放入栈中;
如果调用方法足够多,超过栈最大深度,就会抛出StackOverflowError;
毕竟有出现异常的就是递归深度过深 或 循环调用;
若代码无异常,可尝试调整栈内存大小;
栈帧:可以理解为方法在运行时的数据集,主要包括局部变量表、操作数栈、动态链接、方法出口、附加信息。
推荐阅读
- 深入理解Java虚拟机:JVM高级特性与最佳实践
- JVM虚拟机规范
- JVM源码分析之临门一脚的OutOfMemoryError完全解读