自己学习总结,仅供自己参考,如有不对欢迎指正
一、JVM运行时数据分区
主要分为堆
、方法区
、虚拟机栈
、本地方法栈
、程序计数器
5个部分
堆和方法区是线程共享,虚拟机栈、本地方法栈、程序计数器是属于线程私有
-
堆
分新生代
和老年代
,比例是1:2;新生代分为Eden、from、to
三个区域,并且内存比例为8:1:1(采用此比例主要原因是,新生代大部分内存都是短暂存活的,防止内存浪费) -
方法区
常量池。存放类信息、静态变量、静态常量、常量、运行时常量等 -
程序计数器
当前线程正在执行的字节码行号指示器,每次只会存储一个数据,是唯一不会内存溢出的区域
-
虚拟机栈
存放栈帧
,一个栈帧对应线程的一个方法。栈帧又分为局部变量表
、操作数据栈
、动态链接
、方法出口
递归有可能造成栈空间不足,抛出stack over flow error的错误。 -
本地方法区
用来记录线程要执行的本地方法
二、GcRoot,垃圾回收的算法
第一步:确定垃圾
-
引用计数法
简单理解,对象被引用一次,计数器+1,当计数器为0,则视为垃圾 -
可达行分析法
GcRoot与对象之间没有可达的路径,并被至少标记过两次,则视为垃圾
第二步:垃圾回收算法
-
标记清除算法
实现原理是,对所有要被清除的对象进行标记,标记完成后统一回收
缺点:
(1)效率低
(2)造成大量不连续的内存。导致可用空间降低,频繁GC -
复制算法
实现原理是,将内存容量分成已使用和未使用两块,当一块内存满了,会复制起存活的对象到一块新的内存上,并将该内存对象清理掉。
优点,效率高;缺点:内存被压缩了一半 -
标记整理法
实现原理是,标记阶段与标记清除算法相同,标记后将存活的对象移到一侧,清除另一侧的对象 -
分代收集算法
是上面三种算法的结合。jvm运行时堆内存会分为两种,新生代和老年代。
新生代,标记复制算法(老年代大部分内存都是短暂存活的)
老年代, 标记整理算法(老年代每次只会有少量内存被回收)
参考链接1:https://www.bilibili.com/video/BV1y4411P7C2?from=search&seid=98352672442840858
参考链接2:https://zhuanlan.zhihu.com/p/144930844
参考链接3:https://www.cnblogs.com/newAndHui/p/13112066.html
网友评论