您的位置:首页 > 编程语言 > Java开发

学习【深入理解java虚拟机】 Java内存

2015-02-05 14:08 441 查看
java内存
运行时数据区域

1程序计数器

2java虚拟机栈
线程私有的,生命周期和线程一致
存放局部变量,编译期间已经知道的基本数据类型
经常有人把内存分为堆和栈,分类比较粗糙,但是也说明大家最关注这2个

3本地方法栈(和2类似,给外调的非java使用的)

4java堆
最大的一块
所有对象实例都在这里
是java GC的主要区域
5方法区(永久带)
是各个线程共享的一个区域
用于存放被加载的类信息,常量,静态变量
是对象的一部分,但是叫非堆
低版本可能回收不够,抛异常
方法区无法满足内存的时候,就是outofMenoryError错误、

6运行时常量池
方法区的一部分class的版本,作者,等消息

7直接内存(调非java方法时,或者io交互)

--------------------------------------------------
1java堆溢出
不断的往list里面添加对象,

[align=left]/**[/align]
[align=left] * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError[/align]
[align=left] * @author dzl[/align]
[align=left] *[/align]
[align=left] */[/align]
public class TestOOM
{
[align=left] static class OOMObject{[/align]
[align=left] [/align]
[align=left] }[/align]
public static void main(String[]
args) {
[align=left] List<OOMObject> list = new ArrayList<TestOOM.OOMObject>();[/align]
while ( true)
{
[align=left] list.add( new OOMObject());[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]

[align=left]Exception in thread "main" java.lang.OutOfMemoryError: Java heap space[/align]
[align=left] at java.util.Arrays.copyOf( Arrays.java:2760)[/align]
[align=left] at java.util.Arrays.copyOf( Arrays.java:2734)[/align]
[align=left] at java.util.ArrayList.ensureCapacity( ArrayList.java:167)[/align]
[align=left] at java.util.ArrayList.add( ArrayList.java:351)[/align]
[align=left] at com.travelsky.sh.mytrip.webservice.serrvice.TestOOM.main(TestOOM.java:18)[/align]

[align=left]2虚拟机栈和本地方法栈溢出stackOverflowError[/align]
[align=left]死循环累加[/align]
[align=left]32位内存限制是2个G,[/align]
[align=left]减去Xmx最大推容量,减掉MaxPermSize(最大方法区容量),忽略计数器,剩下的就是虚拟机栈的容量[/align]
[align=left]要扩大这个容量,就需要减小最大堆容量或者方法区容量[/align]

[align=left]也就是说[/align]
[align=left] 最大推容量Xmx(最小Xms)+最大方法区容量MaxPermSize+虚拟机栈的容量Xss[/align]
MaxPermSize缺省值和-server -client选项相关。

-server选项下默认MaxPermSize为64m

-client选项下默认MaxPermSize为32m

[align=left]3方法区和运行时常量异常[/align]
[align=left]静态变量太多[/align]
[align=left]OutOfMemoryError:permGen space [/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: