JVM基础和内存区域剖析

 我来答
黑科技1718
2022-05-31 · TA获得超过5872个赞
知道小有建树答主
回答量:433
采纳率:97%
帮助的人:81.7万
展开全部

概念

特点

先进后出

虚拟机栈:用户描述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] (用于年老代,采用标记/清除算法)

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
意法半导体(中国)投资有限公司
2023-06-12 广告
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,具有以下基本参数:1. 工作频率:72MHz2. 外部时钟:最高可达120MHz3. 存储器容量:64K bytes4. 数据总线宽度:32位5. 输入/输出端口... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式