3359 blog.csdn.net/z 69183787/article/details/75530650
一、背景知识
1、JVM体系结构
2、JVM运行时数据区
3、JVM内存模型
JVM运行时内存=共享内存区域线程内存区域
3-1、共享内存区域
共享内存空间=永久带堆
持续带=方法区其他
堆=Old Space Young Space
Young Space=加油大炮S0 S1
3-1-1,持久
JVM在永久带(Permanent Space )中提供方法空间,主要存储所有加载的类信息、方法信息、常量池等。
可以在-XX:PermSize和-XX:MaxPermSize中指定永久波段初始化值和最大值。
Permanent Space与方法区域不同。 Hotspot JVM仅使用Permanent Space实现方法空间,某些虚拟机中不存在
有Permanent Space,通过其他机制实现方法区域。
3-1-2,堆
堆(heap )主要是类的对象实例信息(包括由new操作实例化的对象和定义的数组)。
堆分为Old Space (别名: Tenured Generation )和Young Space。
Old Space主要存储APP应用程序中生命周期长的生存对象;
奋斗的大炮(伊甸园)主要是保管qxdxs的对象;
S0和S1是大小相同的两个内存区域,主要存储每次回收垃圾时奋斗的大炮生存的对象,从对象奋斗的大炮转移到Old Space
的缓冲区(s是指英语单词Survivor Space )。
堆划分区间是为了方便对象的创建和垃圾回收,在后面的垃圾回收部分进行说明。
3-2、线程存储器区域
线程内存空间=单线程内存单线程内存……。
单线程内存=PC Regster JVM堆栈本地方法堆栈
JVM堆栈=堆栈帧堆栈帧.
堆栈帧=局部变量区域操作数区域帧数据区域
在Java中,线程对应于JVM堆栈(JVM堆栈),JVM堆栈记录线程的执行状态。
JVM堆栈由堆栈帧组成,堆栈帧表示方法调用。 堆栈框架由三部分组成:局部变量区域、操作数堆栈和帧数据区域。
二.山青水秀
“堆”是Java存储对象实例的位置。
堆溢出可以分为两种情况:抛出内存溢出错误3360 javaheapspace异常。
1、内存泄漏
内存泄漏是指对象实例在新创建和使用完成后仍会被引用,不会通过垃圾回收释放,并一直存储到没有剩余的内容为止
内存可用。
内存泄漏时,调查泄漏对象是如何被GC ROOT引用的,并通过引用链具体分析泄漏的原因。
分析内存泄漏的工具有Jprofiler、visualvm等。
示例代码:
packagecom.jvm; importjava.util.ArrayList; importjava.util.List; importjava.util.UUID; /**内存泄漏
*@authorfeizi
* @time 2015-1-23上午8:42:53*/
publicclassoomtest { publicstaticvoidmain { string [ ] args }
列表列表=new ArrayList (; while (真)。
list.add(uuid.Randomuuid ) );
}
}
}
看看控制台的输出结果。 这里的JVM参数内存足够大,需要等待一定的时间才能看到效果:
如果使用的是CMD命令行,则可以自行指定参数进行编译和执行,从而加快效果。
请注意,使用以下命令运行程序,并首先使用javac命令将. java源文件编译为. class类字节代码文件:
Java-XM S10 m-XM X10 m-xx :-usegcoverheadlimitoomtest
2、内存溢出
内存溢出意味着在创建新的实力对象时,实例对象比堆中的可用空间占用更多的内存空间。
如果出现内存溢出问题,则可以增加-Xmx来解决此问题,因为程序通常需要的内存大于为虚拟机配置的内存。
示例代码:
packagecom.jvm; importjava.util.ArrayList; importjava.util.List; /**内存溢出
*@authorfeizi
* @time 2015-1-23上午8336056336022*
publicclassoomtest _1{ publicstaticvoidmain { string args [ ] }
列表字节列表=new ArrayList (;
byte list.add (new byte [ 1000 * 1024 * 1024 ];
}
}
看看控制台的效果:
使用CMD命令行指定参数并运行:
jva-verbose : GC-xmn 10 m-xms 20m-xmx 20m-xx : printgcoomtest _ 1
三.线程堆栈
堆栈(JVM堆栈)主要是存储堆栈帧(局部变量表、操作数堆栈、动态链接、方法出口信息)的地方。 注意堆栈和堆栈帧的区别:堆栈包含堆栈帧。
有两个与线程堆栈相关的内存异常。
a ),堆栈溢出错误) )方法调用层次太深,内存不足导致创建新的堆栈帧) ) )。
b ),内存溢出) )线程太多,内存不够,创建新线程) )。
1、java.lang.StackOverflowError
堆栈溢出抛出java.lang.StackOverflowError错误。 这是因为,在方法正在执行、请求新的堆栈帧时,
堆栈的剩余空间小于战斗框架所需的空间。
例如,通过递归调用方法,可以继续生成堆栈帧,并继续填充堆栈空间直到抛出异常。
示例代码:
packagecom.jvm; /***堆栈溢出
*@authorfeizi
* @time 2015-1-23上午9:13:11*/
公共类软件{公共voidstackoverflowmethod (
堆栈溢出方法(;
通过递归调用}/***方法继续生成堆栈帧,并继续填充堆栈空间直到抛出异常:
*@paramargs*/
publicstaticvoidmain (字符串[ ] args ) {
SOFTest sof=newSOFTest (;
sof.stackOverFlowMethod (;
}
}
看看控制台的效果: