单线程下无论栈帧太大还是栈容量太小,及引用深度超过虚拟机允许深度都会抛出StackOverflowError每个方法压入栈的帧大小是不一致的。多线程下当每个线程分配栈帧太大内存不能够扩展时抛出OutOfMemoryError异常线程栈帧越大,可创建的线程越少。
3.方法区参数
-XX:PermSize方法区内存最小值
-XX:MaxPermSize 方法区内存最大值
各个线程共享的内存区域,主要用来存储类的元数据、常量、静态变量、即时编译器编译后的代码等数据
例:-XX:PermSize=20M -XX:MaxPermSize=20M
异常类型 OutOfMemoryError :
原因:常量过多,或代理反射等使用频繁
4.本机直接内存参数
-XX:MaxDirectMemorySize
例:-XX:MaxDirectMemorySize=10M
不足时抛出OutOfMemory异常
四:垃圾收集算法
经典的垃圾回收算法以下几种
一、标记--清除算法(Mark-Sweep)
回收前状态:
回收后状态:
优缺点:
算法执行分为两个阶段标记与清除,所有的回收算法,基本都
基于标记回收算法做了深度优化
缺点:效率问题,内存空间碎片(不连续的空间)
二、复制算法(Copying)
回收前状态:
Eden内存空间 8
Survivor1空间(From空间)1
Survivor2空间(To空间) 1
Eden内存空间与Survivor空间 8:1
回收后状态:
Survivor1空间(From空间)1
Eden内存空间与Survivor空间 8:1