JVM学习回顾

举报
SHQ5785 发表于 2022/09/04 18:28:48 2022/09/04
【摘要】 一、内存分类各位小伙伴,到上一篇博文为止,我们的内存模型相关知识就已经讲完了!不知道大家吸收了多少,这里我们简单的来回顾一下吧!在博文《JVM进阶(三):内存分配与回收策略》中讲到,内存基本分为JAVA栈、本地方法栈、堆和方法区。首先栈存放的是基本类型变量,局部变量,和对象的引用,他在内存中是一块连续的区域,有大小限制,是由系统自动分配的,因此它的读写速度比较快,而且会自动释放掉为该变量所...

一、内存分类

各位小伙伴,到上一篇博文为止,我们的内存模型相关知识就已经讲完了!不知道大家吸收了多少,这里我们简单的来回顾一下吧!

在博文《JVM进阶(三):内存分配与回收策略》中讲到,内存基本分为JAVA栈本地方法栈方法区

首先存放的是基本类型变量,局部变量,和对象的引用,他在内存中是一块连续的区域,有大小限制,是由系统自动分配的,因此它的读写速度比较快,而且会自动释放掉为该变量所分配的内存空间;还有一点就是他还存放线程调用方法时存储局部变量表,操作,方法出口等与方法执行相关的信息。

存放对象和数组;在运行时动态分配内存(比如 new()),较慢,但灵活;是不连续的内存区域,在发出申请的时候,系统首先会遍历一个存有空闲地址节点的链表,找到第一个满足申请大小的节点,将他从链表删除,并分配给申请者,如果空间剩余,则将多出来的加入链表;由Java虚拟机的自动垃圾回收器来管理。分为一个Eden区和两个Survivor区。

方法区主要存放静态变量,常量,全局变量。他的大小不必是固定的,jvm可以根据应用的需要动态调整,同样方法区也不必是连续的。方法区可以在堆(甚至是虚拟机自己的堆)中分配。jvm可以允许用户和程序指定方法区的初始大小,最小和最大尺寸。因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。假如两个线程都在试图找一个类,在该类还没有被加载的情况下,只应该有一个线程去加载,而另一个线程需要等待。

本地方法栈则是为执行Native方法服务,但这个在不同JVM内有不同的内部实现,比如在HotSpot JVMJava虚拟机栈和本地方法栈被实现为同一个栈区。

二、收集方法

在博文《JVM进阶(五):GC 之标记》中讲到,对于收集方法来说一般有两种,“复制”和“标记-清除-整理”。“复制”算法需要留有部分空间用于复制后的存储,适用于朝生夕死的对象;“标记-清除-整理”适用于年老代,清除后形成逻辑上连续的区域,避免了内存碎片。

三、标记方法

在博文《JVM进阶(五):GC 之标记》中讲到,对象被回收之前都要先被标记为可回收的对象,一般有引用计数可达性分析法JAVA采用的可达性分析,从“GC Roots”开始组建一张张的关系网,不在关系网上的就会被清除。标记有两次,因为被标记后还可能会执行finalize()方法。“GC Roots”被记录在OopMap中,能够让虚拟机快速的得到他们,不用遍历整个堆来寻找“GC Roots”了。

四、STW

在博文《JVM进阶(九):年轻代收集器》、《JVM进阶(十):年老代收集器》、《JVM进阶(十一):JAVA G1收集器》中讲到,回收的时候需要暂停程序的所有线程,这个过程叫做STW,我们的程序需要优化的时候,缩短STW也是优化的一部分。

各种收集器都为缩短STW的时间提供了不同的策略,并行的、串行的,作用于年轻代的,作用于年老代的,还有作用于整个堆的。各有各的优劣势,需要搭配使用,不能随意组合。

好啦,这一整块我们算是大概回忆完啦,在后面的博文中我们就要开始讲虚拟机中的类加载机制了!

五、拓展阅读

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。