网上有关“JVM基础和内存区域剖析 ”话题很是火热 ,小编也是针对JVM基础和内存区域剖析寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您 。
概念
特点
先进后出
虚拟机栈:用户描述Java方法执行的内存模型
栈帧:虚拟机栈中的栈元素(用于支持虚拟机进行方法调用和方法执行的数据结构)包括局部变量表、操作数栈 、动态链接、方法出口
1.主要存储:
2.数据过多会导致OutOfMemoryError异常
< JDK 1.8
>=JDK1.8
和永久代的区别:
1.存储位置不同 ,永久代物理上是堆的一部分,和新手代,老年代地址是连续的,而元空间属于本地内存;
2.存储内容不同 ,元空间存储类的元信息,静态变量和常量池等并入堆中;
3.相当于永久代的数据被分到了堆和元空间中
直接内存:避免native空间和java堆中来回进行复制
虚拟机启动时创建,用于存放对象实例 ,几乎所有的对象(包含常量池)都在堆上分配内存,当对象无法再该空间申请到内存时将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。可通过 -Xmx –Xms 参数来分别指定最大堆和最小堆
GC主要管理区域,可以通过-Xmx和Xms来设置最大和最小值 ,也可以通过-XX:NewSize -XX:MaxNewSize设置年轻代初始大小
超出空间大小会抛出OutOfMemoryError异常
新生区
新生区分为两个部分:伊甸区(Eden space)和幸存者区(survivor space)
伊甸区(Eden space)
大部分对象都会在Eden区诞生,并且一段时间不使用就会被GC回收
幸存者区(survivor space)
存在一段时间还在使用的对象会进入survivor区,survivor区包含一个相对的From区和to区 ,两者来回copy,回收没用的对象,用来延长对象的生命周期 。
老年区(old FullGC)
经过多次GC仍然存在的对象会移动到老年区中 ,若老年区也满了,则会产生MajorGC(Full GC),对老年区进行内存清理(STW),若老年区执行了Full GC之后发现还是无法进行对象的报错 ,那么就会产生OOM异常”OutOfMemoryError“
问题:空间不连续,浪费空间
复制算法有2块一样大小的空间,情况对象时将可用的对象移动到to区里 ,复制算法内存空间连续
问题:要用2块空间,所以内存的模型from和to非常的小
只用一块空间,先进行标记无用对象 ,然后整理内存空间地址,最后清除
它只有一条GC线程,且就像前面说的 ,它在运行的时候需要暂停用户程序(stop the world)STW
它有多条GC线程,且它也需要暂停用户程序(stop the world)STW
它有一条或多条GC线程,且它需要在部分阶段暂停用户程序(stop the world) ,部分阶段与用户程序并发执行
serial(用于新生代,采用复制算法)、serial old(用于年老代,采用标记/整理算法)
parNew(用于新生代,采用复制算法) 、Parallel
Scavenge(用于新生代 ,采用复制算法)、Parallel
old(用于年老代,采用标记/整理算法)
concurrent mark sweep[CMS] (用于年老代,采用标记/清除算法)
关于“JVM基础和内存区域剖析”这个话题的介绍 ,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!
评论列表(3条)
我是翰腾号的签约作者“员红龙”
本文概览:网上有关“JVM基础和内存区域剖析”话题很是火热,小编也是针对JVM基础和内存区域剖析寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。...
文章不错《JVM基础和内存区域剖析》内容很有帮助