java内存
运行时数据区域
1程序计数器
2java虚拟机栈
线程私有的,生命周期和线程一致
存放局部变量,编译期间已经知道的基本数据类型
经常有人把内存分为堆和栈,分类比较粗糙,但是也说明大家最关注这2个
3本地方法栈(和2类似,给外调的非java使用的)
4java堆
最大的一块
所有对象实例都在这里
是java GC的主要区域
5方法区(永久带)
是各个线程共享的一个区域
用于存放被加载的类信息,常量,静态变量
是对象的一部分,但是叫非堆
低版本可能回收不够,抛异常
方法区无法满足内存的时候,就是outofMenoryError错误、
6运行时常量池
方法区的一部分class的版本,作者,等消息
7直接内存(调非java方法时,或者io交互)
--------------------------------------------------
1java堆溢出
不断的往list里面添加对象,
/**
* VM Args:
-
Xms20m
-
Xmx20m
-
XX:+HeapDumpOnOutOfMemoryError
*
@author
dzl
*
*/
public
class
TestOOM {
static
class
OOMObject{
}
public
static
void
main(String[] args) {
List<OOMObject> list =
new
ArrayList<TestOOM.OOMObject>();
while
(
true
) {
list.add(
new
OOMObject());
}
}
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(
Arrays.java:2760
)
at java.util.Arrays.copyOf(
Arrays.java:2734
)
at java.util.ArrayList.ensureCapacity(
ArrayList.java:167
)
at java.util.ArrayList.add(
ArrayList.java:351
)
at com.travelsky.sh.mytrip.webservice.serrvice.TestOOM.main(
TestOOM.java:18
)
2虚拟机栈和本地方法栈溢出stackOverflowError
死循环累加
32位内存限制是2个G,
减去Xmx最大推容量,减掉MaxPermSize(最大方法区容量),忽略计数器,剩下的就是虚拟机栈的容量
要扩大这个容量,就需要减小最大堆容量或者方法区容量
也就是说
最大推容量
Xmx(最小Xms)+
最大方法区容量
MaxPermSize+
虚拟机栈的容量Xss
MaxPermSize缺省值和-server -client选项相关。
-server选项下默认MaxPermSize为64m
-client选项下默认MaxPermSize为32m
-server选项下默认MaxPermSize为64m
-client选项下默认MaxPermSize为32m
3方法区和运行时常量异常
静态变量太多
OutOfMemoryError:
permGen space