@@ -495,18 +495,19 @@ PhantomReference<String> phantomRef = new PhantomReference<>(new String("沉默
495
495
496
496
### 12.Java 堆的内存分区了解吗?
497
497
498
- Java 堆被划分为** 新生代** (Young Generation) 和** 老年代** (Old Generation) 两个区域。
498
+ Java 堆被划分为** 新生代** 和** 老年代** 两个区域。
499
499
500
500
![ 三分恶面渣逆袭:Java堆内存划分] ( https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/jvm-21.png )
501
501
502
502
新生代又被划分为 Eden 空间和两个 Survivor 空间(From 和 To)。
503
503
504
504
- ** Eden 空间** :大多数新创建的对象会被分配到 Eden 空间中。当 Eden 区填满时,会触发一次轻量级的垃圾回收(Minor GC),清除不再使用的对象。
505
- - ** Survivor 空间** :每次 Minor GC 后,仍然存活的对象会从 Eden 区或 From 区复制到 To 区。From 和 To 区交替使用 。
505
+ - ** Survivor 空间** :每次 Minor GC 后,仍然存活的对象会从 Eden 区或 From 区复制到 To 区。From 和 To 区可以交替使用 。
506
506
507
507
对象在新生代中经历多次 GC 后,如果仍然存活,会被移动到老年代。
508
508
509
509
> 1 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的得物面经同学 8 一面面试原题:Java 中堆内存怎么组织的
510
+ > 2 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的腾讯面经同学 27 云后台技术一面面试原题:怎么来区分对象是属于哪个代的?
510
511
511
512
### 13.说一下新生代的区域划分?
512
513
@@ -887,6 +888,7 @@ Java 的垃圾回收过程主要分为标记存活对象、清除无用对象、
887
888
> 7 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的vivo 面经同学 10 技术一面面试原题:说一下GC,有哪些方法
888
889
> 8 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的荣耀面经同学 4 面试原题:对垃圾回收的理解?
889
890
> 9 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的字节跳动同学 17 后端技术面试原题:垃圾回收机制 为什么要学jvm 内存泄漏场景
891
+ > 10 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的腾讯面经同学 27 云后台技术一面面试原题:GC?怎么样去识别垃圾?
890
892
891
893
### 24.如何判断对象仍然存活?
892
894
@@ -931,7 +933,7 @@ Java 的垃圾回收过程主要分为标记存活对象、清除无用对象、
931
933
932
934
![ ] ( https://cdn.tobebetterjavaer.com/stutymore/neicun-jiegou-20231227111238.png )
933
935
934
- #### 1、虚拟机栈中的引用(方法的参数、局部变量等)
936
+ ** 1、虚拟机栈中的引用(方法的参数、局部变量等)**
935
937
936
938
来看下面这段代码:
937
939
@@ -954,7 +956,7 @@ public class StackReference {
954
956
955
957
当 greet 方法执行完毕后,localVar 的作用域结束,localVar 引用的 Object 对象不再由任何 GC Roots 引用(假设没有其他引用指向这个对象),因此它将有资格作为垃圾被回收掉 😁。
956
958
957
- #### 2、本地方法栈中 JNI 的引用
959
+ ** 2、本地方法栈中 JNI 的引用**
958
960
959
961
Java 通过 JNI(Java Native Interface)提供了一种机制,允许 Java 代码调用本地代码(通常是 C 或 C++ 编写的代码)。
960
962
@@ -984,7 +986,7 @@ JNIEXPORT void JNICALL Java_NativeExample_nativeMethod(JNIEnv *env, jobject this
984
986
985
987
一旦 JNI 方法执行完毕,除非这个引用是全局的(Global Reference),否则它指向的对象将会被作为垃圾回收掉(假设没有其他地方再引用这个对象)。
986
988
987
- #### 3、类静态变量
989
+ ** 3、类静态变量**
988
990
989
991
来看下面这段代码:
990
992
@@ -1002,7 +1004,7 @@ StaticFieldReference 类中的 staticVar 引用了一个 Object 对象,这个
1002
1004
1003
1005
只要 StaticFieldReference 类未被卸载,staticVar 引用的对象都不会被垃圾回收。如果 StaticFieldReference 类被卸载(这通常发生在其类加载器被垃圾回收时),那么 staticVar 引用的对象也将有资格被垃圾回收(如果没有其他引用指向这个对象)。
1004
1006
1005
- #### 4、运行时常量池中的常量
1007
+ ** 4、运行时常量池中的常量**
1006
1008
1007
1009
来看这段代码:
1008
1010
@@ -1023,6 +1025,7 @@ public class ConstantPoolReference {
1023
1025
这些常量引用的对象(字符串"Hello, World"和 Object.class 类对象)在常量池中,只要包含这些常量的 ConstantPoolReference 类未被卸载,这些对象就不会被垃圾回收。
1024
1026
1025
1027
> 1 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的帆软同学 3 Java 后端一面的原题:哪些对象可以作为 GC Roots
1028
+ > 2 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的腾讯面经同学 27 云后台技术一面面试原题:GC Root?
1026
1029
1027
1030
### 26.finalize()方法了解吗?有什么作用?
1028
1031
@@ -1038,7 +1041,7 @@ public class ConstantPoolReference {
1038
1041
1039
1042
#### 说说标记-清除算法?
1040
1043
1041
- ` 标记-清除 ` (Mark-Sweep) 算法分为两个阶段:
1044
+ ` 标记-清除 ` 算法分为两个阶段:
1042
1045
1043
1046
- ** 标记** :标记所有需要回收的对象
1044
1047
- ** 清除** :回收所有被标记的对象
@@ -1049,24 +1052,39 @@ public class ConstantPoolReference {
1049
1052
1050
1053
#### 说说标记-复制算法?
1051
1054
1052
- ` 标记-复制 ` (Mark-Copy) 算法可以解决标记-清除算法的内存碎片问题,因为它将内存空间划分为两块,每次只使用其中一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后清理掉这一块。
1055
+ ` 标记-复制 ` 算法可以解决标记-清除算法的内存碎片问题,因为它将内存空间划分为两块,每次只使用其中一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后清理掉这一块。
1053
1056
1054
1057
![ 三分恶面渣逆袭:标记-复制算法] ( https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/jvm-23.png )
1055
1058
1056
1059
缺点是浪费了一半的内存空间。
1057
1060
1058
1061
#### 说说标记-整理算法?
1059
1062
1060
- ` 标记-整理 ` (Mark-Compact) 算法是标记-清除复制算法的升级版,它不再划分内存空间,而是将存活的对象向内存的一端移动,然后清理边界以外的内存。
1063
+ ` 标记-整理 ` 算法是标记-清除复制算法的升级版,它不再划分内存空间,而是将存活的对象向内存的一端移动,然后清理边界以外的内存。
1061
1064
1062
1065
![ 标记-整理算法] ( https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/jvm-24.png )
1063
1066
1064
1067
缺点是移动对象的成本比较高。
1065
1068
1069
+ #### 说说分代收集算法?
1070
+
1071
+ ` 分代收集 ` 算法是目前主流的垃圾收集算法,它根据对象存活周期的不同将内存划分为几块,一般分为新生代和老年代。
1072
+
1073
+ ![ 二哥的 Java 进阶之路:Java 堆划分] ( https://cdn.tobebetterjavaer.com/stutymore/gc-20231227131241.png )
1074
+
1075
+ 新生代用复制算法,因为大部分对象生命周期短。老年代用标记-整理算法,因为对象存活率较高。
1076
+
1077
+ #### 为什么要用分代收集呢?
1078
+
1079
+ 分代收集算法的核心思想是根据对象的生命周期优化垃圾回收。
1080
+
1081
+ 新生代的对象生命周期短,使用复制算法可以快速回收。老年代的对象生命周期长,使用标记-整理算法可以减少移动对象的成本。
1082
+
1066
1083
> 1 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的字节跳动面经同学 1 Java 后端技术一面面试原题:垃圾回收算法了解多少?
1067
1084
> 2 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的小米面经同学 F 面试原题:垃圾回收的算法及详细介绍
1085
+ > 3 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的腾讯面经同学 27 云后台技术一面面试原题:回收的方法?分代收集算法里面具体是怎么回收的?为什么要用分代收集呢?
1068
1086
1069
- ### 28.Minor GC/Young GC 、Major GC/Old GC、Mixed GC、Full GC 都是什么意思?
1087
+ ### 28.Minor GC、Major GC、Mixed GC、Full GC 都是什么意思?
1070
1088
1071
1089
Minor GC 也称为 Young GC,是指发生在年轻代(Young Generation)的垃圾收集。年轻代包含 Eden 区以及两个 Survivor 区。
1072
1090
@@ -1076,11 +1094,18 @@ Major GC 也称为 Old GC,主要指的是发生在老年代的垃圾收集。C
1076
1094
1077
1095
Mixed GC 是 G1 垃圾收集器特有的一种 GC 类型,它在一次 GC 中同时清理年轻代和部分老年代。
1078
1096
1079
- Full GC 是最彻底的垃圾收集,涉及整个 Java 堆和方法区(或元空间)。它是最耗时的 GC,通常在 JVM 压力很大时发生。
1097
+ Full GC 是最彻底的垃圾收集,涉及整个 Java 堆和方法区(元空间)。它是最耗时的 GC,通常在 JVM 压力很大时发生。
1098
+
1099
+ #### FULL gc怎么去清理的?
1100
+
1101
+ Full GC 会从 GC Root 出发,标记所有可达对象。新生代使用复制算法,清空 Eden 区。老年代使用标记-整理算法,回收对象并消除碎片。
1102
+
1103
+ 停顿时间较长(STW),会影响系统响应性能。
1080
1104
1081
1105
> 1 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的阿里面经同学 5 阿里妈妈 Java 后端技术一面面试原题:full gc 和 young gc 的区别
1106
+ > 2 . [ Java 面试指南(付费)] ( https://javabetter.cn/zhishixingqiu/mianshi.html ) 收录的腾讯面经同学 27 云后台技术一面面试原题:FULL gc怎么去清理的?
1082
1107
1083
- ### 29.Minor GC/Young GC 什么时候触发?
1108
+ ### 29.Minor GC 什么时候触发?
1084
1109
1085
1110
新创建的对象优先在新生代 Eden 区进行分配,如果 Eden 区没有足够的空间时,就会触发 Young GC 来清理新生代。
1086
1111
0 commit comments