Java虚拟机第一章实践
Java堆溢出
· Java堆溢出通常是对象创建过多,通过设置Java堆最大值,可以进行实验,将堆的最小值(-Xms)与最大值(-Xmx)设置相等便可防止堆自动扩展。
虚拟机栈与本地方法栈溢出
请求栈深大于所允许最大深度(StackOverflow)
扩展栈时无法申请足够空间(OutOfMemory)
32位操作系统限制进程内存为2GB,分配给堆,方法区,程序计数器不计,剩下的就给了本地方法栈。如果内存溢出,可以通过减小堆内存来增大本地方法栈。
方法区与内存常量池溢出
常量池溢出,比如字符串创建过多。
方法区用于存放Class信息,因此遇到类增强与动态语言时(JSP,框架,CGlib),就容易遇到方法区溢出问题。
intern()方法在JDK1.7,JDK1.6运行结果不一样,原因在于JDK1.6中intern采取复制,JDK1.7中采用在常量池中直接标记引用的方法。
直接内存溢出
直接内存默认与最大堆内存相等。
如果遇到非明显异常,Dump文件很小,有可能就是直接内存溢出。
附录:虚拟机参数设置
-XMs 堆最小大小
-XMm 堆最大大小
-XX:+HeapDumpOnOutOfMemoryError Dump处OOM快照以便分析
-Xss 本地方法栈大小
-XX:PermSize 方法区大小
-XX:MaxPermSize 方法区最大大小
-XX:MaxDirectMemorySize 直接内存大小