力扣刷题
第一个题简简单单,就是异或^
第二个题目之前做过用的快慢指针,但是这次的方法也很好,使用一个范围外的数字做标志就可以了。
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