2023.12.11日收获

文章探讨了Java编程中的异或操作在力扣刷题中的应用,以及涉及JVM对象实例化过程、对象内存布局、执行引擎的工作原理,重点讲解了垃圾回收算法,包括引用计数、可达性分析和不同类型的垃圾回收器,如ParNewGC、CMS和G1GC,以及内存泄漏和内存管理的相关概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

力扣刷题

第一个题简简单单,就是异或^

第二个题目之前做过用的快慢指针,但是这次的方法也很好,使用一个范围外的数字做标志就可以了。
在这里插入图片描述

class Solution {
    public int singleNumber(int[] nums) {
        int result = 0;
        for (int num : nums) {
            result ^= num;
        }
        return result;
    }
}

在这里插入图片描述

public class Solution {
    public boolean hasCycle(ListNode head) {
        int temp = Integer.MAX_VALUE;
        if(head == null){
            return false;
        }
        head.val = temp;
        while((head= head.next )!= null){
            if(head.val ==temp){
                return true;
            }
            head.val =temp;
        }
        return false;
    }
}

JVM

对象实例化

在这里插入图片描述
创建对象步骤:
1.判断类是否加载链接初始化
2.为对象分配内存(对象头,实例数据,补齐部分)
如何分配?指针碰撞(一边是没被分配的空间,一边是分配的空间,用指针移动去分配空间,没有碎片)和空闲列表(CMS,有碎片,用空闲列表记录那些为空的,然后进行分配)
3.处理并发安全问题
CAS加锁 TLAB每个对象分配一个小空间
4.初始化分配到的空间
将控件初始化为0(操作实例数据)
5设置对象的对象头
6执行init

对象内存布局

1.对象头/实例数据/填充部分
对象头中中包括运行时元数据(hash值,分代年龄,锁状态标识)和类型指针(指向方法区中类元信息)
2.实例变量:自己和父类的实例变量(父类私有的也会放)
父类先放,宽度一样的放在一起

3.对齐补充

对象访问定位(如何访问对象)

方式一:句柄访问
弊端:额外维护一个句柄池,访问还需要绕一下
好处:对象改变只需要改变句柄池的上部分
在这里插入图片描述
方式二:直接使用指针访问
hotsport用的这种

执行引擎篇

作用:将字节码解释或编译为本地机器指令
主要是解释器和即时编译器
在这里插入图片描述
方法的执行就是靠的执行引擎

半编译 半解释(JIT)

解释器:逐行翻译(效率差)

AOT静态编译器
程序运行前转化为机器码,但是会引起不可移植性。

JIT动态编译器
热点代码缓存(如循环代码),能够做进一步优化

垃圾回收篇

什么叫垃圾?没有任何指针指向的对象
为什么需要GC?不GC空间迟早呗占满

堆是垃圾回收的重点,主要是young区,其次是old区,最次是permint区

垃圾回收算法

垃圾判别算法

1)引用计数算法:用变量记录引用次数 简单,但是额外空间和时间开销,解决不了循环调用方式的回收
没选这种
2)可达性分析算法:
根搜索算法,维护一个根roots,进行向下搜索
哪些可以作为root呢?1)局部变量表2)类的静态引用通告变量,3)锁持有的对象4)常量引用对象

垃圾清除算法

1.标记清除:标记的是不是垃圾的对象,然后把没标记的清除 缺点:内存碎片化
2.复制算法:缺点:需要两倍内存对象
3.标记压缩:向上复制,尽量不碎片化,优点:消除了上面两种的缺点
但效率低,又消除又移动
4.分代收集算法:新生代用赋值,老年代用标记压缩

相关概念

1.system.gc()提醒jvm去gc
finalize死之前的遗言,此方法只能调用一次

内存泄漏和内存溢出
溢出:回收赶不上消耗,或者创建大对象但是空间太散了

泄露情况:
1.静态赋值情况
2.单例模式
3.各种连接资源

并行对应串行
并发对应独占式

安全点:执行比较长的指令,方法调用等这种会进行gc
安全区域:sleep或者blocked这一段的区域进行回收

五种引用
强引用:不回收

下面两种用于内存不足情况,或者缓存的数据
软引用:内存不足再回收

弱引用:发现就回收

虚引用:对象跟踪操作

垃圾回收器:
好几个垃圾回收器就是并行,否则是串行

并发式:就是正常程序与gc同时执行
独占就是gc独占

gc评估指标:
吞吐量:运行用户代码时间/(运行用户代码时间+垃圾回收时间)
暂停时间:执行垃圾收集时,线程被暂停的时间
内存占用:Java堆所占的内存大小

吞吐量与暂停时间是矛盾的,想要暂停时间短就需要频繁gc,但是这样总时间可能就会长

各种GC

在这里插入图片描述

为什么如此多GC?不同需求使用不同GC
以后会是ZGC CMS被删了
1)Serial GC:串行回收(两个)
新生代复制算法,老年代是标记压缩算法 比较老了
单个CPU环境下是简单而高效的
2)ParNew GC:并行加STW
串行GC的多线程版本,算法一样,多核场景下,效果更好一些
3)parallel GC:并行加STW
注重吞吐量 目标实现一个可控制的吞吐量

4)CMS
第一次实现了用户线程与垃圾回收同时执行
初始标记STW 并发标记 重新标记STW 并发清理
其用的标记清理而不是前面的标记整理
到达一定阈值就清除

5)G1GC
兼顾吞吐量和回收时间
特点:兼具并行与并发
将内存分为一个一个region region之间是复制算法,整体来看是标记压缩
针对大内存和多处理器应用

根据垃圾价值进行回收 Garbage First

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值