JVM学习笔记(2)——MarkWord和GC入门

简介: JVM学习笔记(2)——MarkWord和GC入门

一、as if serial

不管如何重排序,单线程执行结果不会变

二、对象的创建过程


三、对象占用多少字节

对象的MarkWord一般占8字节,MarkWord的2位来表示锁的状态,分代年龄也在MarkWord里,表明这个对象被GC回收了多少次

+ UseCompressedClassPointers和+ UserCompressedOops,这2个参数是JVM默认开启的

UseCompressedClassPointers会把_class pointer从8字节压缩到4字节


UserCompressedOops会压缩对象的引用类型的成员变量。如图,String本来应该是8字节,由于这个参数,被压缩到了4字节


21aa3e5f47bc457facbf0175b946e4df.png

MarkWord

为什么GC年龄默认为15 ?

可以看到分代年龄占4位,而4位最多表示16种状态: 0~15。所以年龄最大是15,是这么来的

调用hasCode导致锁升级

四、GC

何为垃圾

单一个对象没被引用的时候,这个对象就成了垃圾

怎么发现垃圾

引用计数器

说白了就是一个对象被引用了,计算器+1,这个对象没被引用,计数器变为0,就回收。

引用计数器无法解决循环引用,A引用B,B引用C,C引用A,那么这3个对象永远无法被回收

GC Root(可达性分析算法)

JVM采用的是GC Root

此算法的核心思想:通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为“引用链”,当一个对象到 GC Roots 没有任何的引用链相连时(从 GC Roots 到这个对象不可达)时,证明此对象不可用。以下图为例:


在Java语言中,可作为GC Roots的对象包含以下几种:

  1. 虚拟机栈(栈帧中的本地变量表)中引用的对象。(可以理解为:引用栈帧中的本地变量表的所有对象)
  2. 方法区中静态属性引用的对象(可以理解为:引用方法区该静态属性的所有对象)
  1. 方法区中常量引用的对象(可以理解为:引用方法区中常量的所有对象)
  2. 本地方法栈中(Native方法)引用的对象(可以理解为:引用Native方法的所有对象)

GC算法

标记-清除算法


简单来说就是把没用的进行标记,然后清楚掉标记的

适用场景:存活对象比较多

缺点:需要进行2次扫描(一次标记,一次清除),容易产生内存碎片

复制算法

开辟一个新的空间,把存活的对象移动到新空间

适用场景:存活对象比较少的情况,因为涉及到了对象的移动,对象存活的少了,移动次数肯定少,效率自然高

标记-压缩

说白了就是把存活对象挤到一起,集中起来,然后剩下的垃圾对象直接清理

分代算法

分代算法其实跟垃圾回收器有关,ZGC之前所有的垃圾回收器都是分代算法。ZGC不在分年轻代和老年代

G1是逻辑分代,物理不分代

目录
相关文章
|
4月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
417 3
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
65 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
18天前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
43 3
|
1月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
1月前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
60 0
|
4月前
|
存储 算法 安全
(八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析
在《GC分代篇》中,我们曾对JVM中的分代GC收集器进行了全面阐述,而在本章中重点则是对JDK后续新版本中研发推出的高性能收集器进行深入剖析。
164 12
|
4月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
103 8
|
3月前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
3月前
|
存储 监控 算法
深入解析JVM内部结构及GC机制的实战应用
深入解析JVM内部结构及GC机制的实战应用