@@ -128,14 +128,15 @@ Java的SPI:SPI 的本质是将接口实现类的全限定名配置在文件中
128128- 1.7 -> 1.8: 将运行时数据区方法区(永久代)移动到直接内存中,字符串常量池仍然在堆中。
129129
130130
131- 对象的创建过程:
131+ ## 对象的创建过程
1321321 . 类加载检查
1331332 . 分配内存:指针碰撞或空闲列表
134+ - 当多个对象并发争抢空间时,有两种解决办法:CAS 和本地线程分配缓冲(TLAB,默认方式)
1341353 . 初始化零值
1351364 . 设置对象头
1361375 . 执行构造方法
137138
138- 对象的内存布局:
139+ ## 对象的内存布局
1391401 . 对象头,两部分组成:存储自身运行时数据如哈希码,GC分代年龄;指向类的类型指针
1401412 . 实例数据,真正存储有效信息的部分
1411423 . 对齐填充,起占位作用
@@ -152,14 +153,14 @@ JVM触发GC时,首先会让所有的用户线程到达安全点SafePoint时阻
152153- 引用计数算法
153154- 可达性分析
154155
155- 哪些对象可以作为GC Roots?
156+ ## 哪些对象可以作为GC Roots
156157- 虚拟机栈(栈帧中的本地变量表)中引用的对象
157158- 本地方法栈(Native 方法)中引用的对象
158159- 方法区中类静态属性引用的对象
159160- 方法区中常量引用的对象
160161- 所有被同步锁持有的对象
161162
162- 内存分配和回收原则:
163+ ## 内存分配和回收原则
163164- 对象优先在Eden区分配
164165- 大对象直接进入老年代
165166- 长期存活的进入老年代
@@ -171,8 +172,15 @@ JVM触发GC时,首先会让所有的用户线程到达安全点SafePoint时阻
171172 - Mixed GC:整个新生代和部分老年代,只有G1收集器有
172173- Full GC:整个Java堆和方法区
173174
175+ ### Full GC 触发条件
176+ 1 . 老年代空间不足
177+ 1 . 创建大对象,Eden 区域放不下大对象,直接进入老年代
178+ 2 . Minor GC 后,存活对象进入老年代
179+ 2 . 调用 system.gc(),系统会建议执行 FGC
180+ 3 . 空间分配担保机制失败
181+
174182## 空间担保策略
175- 空间担保策略是 JVM 的一种机制,确保在 Minor GC 时,存活的对象能够成功晋升到老年代。如果老年代没有足够的空间来接收新晋升的对象,JVM 可能会提前触发 Full GC 来释放空间,或者调整内存分配策略避免此类情况的发生 。
183+ 空间担保策略是 JVM 的一种机制,发生 Minor GC 之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果小于,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小,如果大于,则尝试进行一次Minor GC,但这次Minor GC依然是有风险的;如果小于或者HandlePromotionFailure=false,则改为进行一次Full GC 。
176184
177185## 垃圾收集算法
178186- 标记——清除算法:顾名思义,标记可回收的对象并清除。
@@ -282,7 +290,10 @@ Java NIO:
282290
283291### synchronized
284292
285- 底层是通过对象监听器实现的,再底层是操作系统的互斥量(mutex)实现的
293+ 1 . 修饰普通方法/静态方法:通过 monitorenter 和 monitorexit 指令实现同步
294+ 2 . 修饰代码块:通过 ACC_SYNCHRONIZED 标记符实现同步
295+
296+ 底层都是通过对象头里 Mark Word 指向的对象监听器(Monitor)实现的,再底层是操作系统的互斥量(mutex)实现的
286297
287298同一时刻只能有一个线程运行 synchronized(lock) 内的代码块,其他线程会否则** 阻塞** 。PS:获取锁(运行代码块),释放锁(阻塞代码块)
288299
@@ -597,3 +608,11 @@ java中静态属性和静态方法可以被继承,但是不能被重写,因
597608- List[ ] 、List[ ] 擦除后的类型为 List[ ] ;
598609- List<? extends E>、List<? super E> 擦除后的类型为 List;
599610- List<T extends Serialzable & Cloneable> 擦除后类型为 List。
611+
612+ # [ JDK 设计模式] ( https://www.cnblogs.com/vipstone/p/18361126 )
613+ 1 . 单例模式:Runtime 类使用饿汉式创建单例
614+ 2 . 工厂模式:线程池中所有线程,通过工厂模式创建
615+ 3 . 代理模式:` java.lang.reflect.Proxy ` 中的动态代理
616+ 4 . 迭代器模式:` java.util.Iterator ` 使用迭代器遍历集合容器
617+ 5 . 模板方法:AQS 中的 ` acquire ` 和 ` release ` 方法被独占式和共享式所重写
618+
0 commit comments