2023年10月23日14:04:44
jvm
1.jdk体系结构图回顾(Av333129672,P1)
jdk
jre
底层是hotspot jvm
2.java虚拟机内部组成(Av333129672,P2)
堆
方法区
执行引擎
类加载
本地方法栈
线程栈(虚拟机栈)
3.java虚拟机栈讲解(Av333129672,P3)
程序计数器(记录行号,是由执行引擎来控制的)
栈帧
局部变量表(存储变量)
操作数栈(用javap 反编译 之后 那些个机器码指令方法。加法入栈)
动态链接(栈里面对应的方法区的内存地址)
方法出口(执行完之后,方法该返回的地方)
4.程序计数器综合讲解(Av333129672,P4)
5.方法区和本地方法栈讲解(Av333129672,P5)
方法区
静态常量
…
本地方法栈
native 标示的 c++实现的一些方法,像那个thread.start里面有个start0就是
本地方法栈
6.堆内存讲解(Av333129672,P6)
老年代,新生代(eden survior1 survior2=8 1 1 )
演示了jvisualjvm,可视化了堆内存的变化。启动就直接监听当前执行的线程。
7.阿里内部jvm调优工具arthas详解(Av333129672,P7)
这个工具好呀,不用jstack了
启动之后,有board,输入线程id,可以反编译成java代码,就不用因为线上代码问题,扯皮了。
8.jvm垃圾收集机制详解(Av333129672,P8)
触发minor gc。eden区-》s1,之后就是eden和s1 根据可达性算法,回收那些非可达的资源。把用可达性算法走的链路上的资源移动到s2.同时年龄加1。
年龄15了,移动到old。old也满了,触发full gc。STW stop the world。
9.电商系统jvm参数调优实战(Av333129672,P9)
why need STW
STW stop the world。存在意义。如果没有这个东西,那么前面gc线程去标识为非垃圾资源的对象,可能因为(没有stw机制)用户线程执行完任务,释放了栈帧资源,导致那些非垃圾资源的对象变为了垃圾。那就需要重新去全局扫描。这显然不合适,所以需要stw。
除了年龄到达15会直接移动到old,还有大文件也会直接移动到old,还有就是底层的 动态年龄机制,像大小如果大于s1的50%,就直接移动到old。
调优其实就是为了一件事——减少full gc。因为full gc 会stw,会导致用户端的使用,会降低吞吐量,会一卡一卡的。
10.阿里面试题:能不能对java虚拟机调优,让其几乎不发生full gc(Av333129672,P10)
调大eden区,使得那些过两三秒就变垃圾的对象在minor gc就解决掉。
11.垃圾收集器cms、g1、zgc讲解(Av333129672,P11)
垃圾收集器都是为了 解决不同业务场景出现的,在不考虑垃圾回收器的情况下,先想想能不能通过那些参数来解决问题
单机百万级请求。每条请求1kb,每秒100条请求。
12.动手实战优化自己公司线上系统jvm(Av333129672,P12)
提到了G1的关键,目标暂停时间, maxGcPauseMillions设置之后,对eden区的回收就不会整体回收了,而是在过程中通过算法计算回收的时间,如果达到目标最大时间,那么就进行分块回收。(虽然不会节约时间,可是分散了时间,用户感知没那么明显)
13.动手实战优化自己公司线上系统jvm(Av333129672,P13)
14.cpu多核并发缓存架构(Av333129672,P14)
cpu速度越来越快,内存速度没改变,在其中加个cpu缓冲区。
15.java多线程内存模型讲解(Av333129672,P15)
类似cpu多和并发缓存架构。
每个线程自己有一个工作内存,然后把主内存里面的变量复制到自己的工作内存里面,然后处理。
16.内存模型底层八大原子操作与缓存一致性协议(mesi)(Av333129672,P16)
read
load
write
store
17.volatile可见性底层原理(Av333129672,P17)
lock 如果lock了(加了volitel),就马上直接写回主内存。同时总线开启缓存一致性协议,然后其他的线程开始嗅探。如果发现资源发生改变了,立马让自己的失效,从而达成 可见性。
unlock
18.cpu指令重排(Av333129672,P18)
cpu会对指令进行优化,以他认为快速的方式去执行。
19.as-if-serial与happens-before原则详解(Av333129672,P19)
as-if-serial,如果在单线程下执行结果不变,那么就是可以交换的。(也只能是单线程,多线程的依赖关系太复杂了)
后面提到了一个规范,happens-before,也是用来应对这个情况的。(其中有 unlock必须在下一个lock之前;volitle的写必须在读之前)
20.双重检测锁dcl指令重排问题剖析(Av333129672,P20)
单例模式,
提到了对象新建。
类加载检查(去常量表里面查看,如果没有就加载,然后分配)
分配内存(默认的指针碰撞,如果是有序的,空闲和非空闲不是在一起的,移动指针就可以起到划分内存了;如果不是有序的,则为一张表,然后从表中找到连续的内存来分配)
初始化为默认值
然后设置对象头(锁标记等等)
最后赋值,构造方法init
半初始化:(构造对象时,构造代码被重排序了,单线程内部没影响)还没有赋值呢,只是构造器初始化了一下,然后不为null了,就导致其他的 线程去使用了。
21.深入hotspot源码讲解jvm内存屏障(Av333129672,P21)
汇编那里加个lock指令实现的。
22.java多线程与并发编程技术图谱解析(Av333129672,P22)
这么整理自己的offer
23.从hotspot源码看下并发同步原语设计机制(Av333129672,P23)
24.讲透无锁、偏向锁、轻量级锁、重量级锁(Av333129672,P24)
互斥锁、悲观锁、同步锁、重量级锁
线程阻塞,上下文切换,操作系统线程调度(休眠,唤醒)。
sychronized
jdk1.6之前 阻塞队列、等待队列、monitor、互斥量
无锁、自旋锁、轻量级锁、乐观锁
CAS compareAnd
25.从汇编底层深度理解cas机制(Av333129672,P25)
26.cas机制与aba问题(Av333129672,P26)
原子性:cas在java这个层面是不加锁的,在汇编层面是使用lock加锁保证原子性的。
aba:两个线程,一个执行特别快, 在我用之前,就已经用了并且把样子还原了。 但事实已经改变了。 automicStamp 引入版本号。
27.Synchronized底层的锁优化机制(Av333129672,P27)
无锁
偏向锁(只有一个线程,对象头存入线程id,如果是,就继续执行)
锁升级
轻量级锁(多个线程cas,竞争自旋,CPU打满)
重量级锁(重度竞争)
28.从hotspot底层对象结构理解锁膨胀升级过程(Av333129672,P28)
001
101
00
10
11(gc)
29.深入jdk源码理解longadder的分段cas优化机制(Av333129672,P29)
30.bat大厂高并发项目锁优化最佳实践(Av333129672,P30)
31.jvm主要组件讲解(Av333129672,P31)
32.程序计数器与java虚拟机栈讲解(Av333129672,P32)
33.堆空间、方法区、jvm执行引擎工作原理讲解(Av333129672,P33)
34.jvm如何创建一个对象(Av333129672,P34)
35.jvm垃圾收集算法讲解(Av333129672,P35)
36.对象内存分配流程讲解(Av333129672,P36)
(多线程)对象直接在eden私有空间里面进行分配,也不用去 碰撞指针了。
37.内存泄漏与内存溢出问题剖析(Av333129672,P37)
38.常见的jvm面试问题解析(Av333129672,P38)
39.Class类文件核心结构剖析(Av333129672,P39)
40.jvm常量池详细讲解(上)(Av333129672,P40)
41.jvm常量池详细讲解(下)(Av333129672,P41)
42.从字节码底层分析This和New关键字原理(上)(Av333129672,P42)
43.从字节码底层分析This和New关键字原理(下)(Av333129672,P43)
44.jvm方法区线上调优解析(Av333129672,P44)
45.判断可回收垃圾对象(Av333129672,P45)
46.引用计数法解析(Av333129672,P46)
47.可达性分析算法解析(Av333129672,P47)
48.jvm垃圾回收算法深度剖析(Av333129672,P48)
49.常用垃圾收集器解析(Av333129672,P49)
类装载系统
young gc stw时间很短
ps pold
serial serialold
parNew CMS
对于年轻代都是复制,对于老年代,除了特殊的CMS以外是标记清除,都是标记整理。
CMS
浮动垃圾 错标
只标第一个,后面再慢慢标记。
为了解决STW太长
50.jvm内存模型深度剖析(Av333129672,P50)
51.jvm垃圾回收调优工具使用详解(Av333129672,P51)
52.g1与zgc垃圾回收器剖析(Av333129672,P52)
53.百万级交易系统jvm内存调优实战(Av333129672,P53)
54.从java.exe开始讲透Java类加载全过程(Av333129672,P54)
55.类加载底层详细流程以及双亲委派机制介绍(Av333129672,P55)
56.从jdk源码级别剖析jvm核心类加载器(Av333129672,P56)
57.从jdk源码级别剖析类加载双亲委派机制(Av333129672,P57)
58.双亲委派机制详解以及面试题讲解(Av333129672,P58)
59.手写自定义类加载器打破双亲委派机制(Av333129672,P59)
60.tomcat类加载机制深度剖析(Av333129672,P60)
61.互联网公司类加载机制核心面试点解析(Av333129672,P61)