学习【深入理解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]
运行时数据区域
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]
相关文章推荐
- Java学习之【深入理解Java虚拟机---Java内存区域】
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
- 深入理解java虚拟机 第2章(一):Java内存区域
- 【1】深入理解java虚拟机 java内存区域
- [深入理解JAVA虚拟机]读后个人总结二之JAVA内存区域
- 读 - 深入理解java虚拟机 - 笔记(一) - java内存区域模型(2章)
- 读 - 深入理解java虚拟机 - 笔记(七-1) - Java内存区域(2章)-对象创建
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
- 深入理解Java虚拟机 读书笔记 之 java内存区域与内存溢出
- 《Java编程思想_ 深入理解java虚拟机_Thinking in java__Effiect java__设计模式》学习笔记7——泛型编程基础
- Java基础学习总结(71)——深入理解Java虚拟机内存
- 深入理解java虚拟机(一):java内存区域(内存结构划分)
- 【深入理解Java虚拟机】Java内存区域模型、对象创建过程、常见OOM
- 深入理解java虚拟机学习 笔记 第二章 java 内存区域和内存溢出异常
- 深入理解Java虚拟机--java内存区域
- Java虚拟机深入学习之一: Java虚拟机的内存区域
- 深入理解Java虚拟机 之 Java 内存区域
- 深入理解Java虚拟机 - Java内存区域
- 深入理解Java虚拟机----第2章 Java内存区域与内存溢出异常
- Java基础学习总结(71)——深入理解Java虚拟机内存