@@ -13401,7 +13401,7 @@ HotSpot VM 可以通过 VM 参数设置程序执行方式:
1340113401
1340213402- -Xint:完全采用解释器模式执行程序
1340313403- -Xcomp:完全采用即时编译器模式执行程序。如果即时编译出现问题,解释器会介入执行
13404- - -Xmixed:采用解释器+ 即时编译器的混合模式共同执行程序
13404+ - -Xmixed:采用解释器 + 即时编译器的混合模式共同执行程序
1340513405
1340613406
1340713407
@@ -13422,11 +13422,11 @@ OSR 替换循环代码体的入口,C1、C2 替换的是方法调用的入口
1342213422
1342313423热点探测:JIT 编译器在运行时会针热点代码做出深度优化,将其直接编译为对应平台的本地机器指令进行缓存,以提升 Java 程序的执行性能
1342413424
13425- CodeCache 用于缓存编译后的机器码, 动态生成的代码和本地方法代码 JNI,如果 CodeCache 区域被占满,编译器被停用,字节码将不会编译为机器码,应用程序继续运行,但运行速度会降低一个数量级,严重影响系统性能
13425+ CodeCache 用于缓存编译后的机器码、 动态生成的代码和本地方法代码 JNI,如果 CodeCache 区域被占满,编译器被停用,字节码将不会编译为机器码,应用程序继续运行,但运行速度会降低一个数量级,严重影响系统性能
1342613426
13427- HotSpot VM 采用的热点探测方式是基于计数器的热点探测,为每一个方法都建立2个不同类型的计数器 :方法调用计数器(Invocation Counter)和回边计数器(BackEdge Counter)
13427+ HotSpot VM 采用的热点探测方式是基于计数器的热点探测,为每一个方法都建立 2 个不同类型的计数器 :方法调用计数器(Invocation Counter)和回边计数器(BackEdge Counter)
1342813428
13429- * 方法调用计数器:用于统计方法被调用的次数,默认阈值在Client 模式 下是1500 次,在 Server 模式下是10000 次,超过这个阈值,就会触发 JIT 编译,阈值可以通过虚拟机参数 `-XX:CompileThreshold` 设置
13429+ * 方法调用计数器:用于统计方法被调用的次数,默认阈值在 Client 模式 下是 1500 次,在 Server 模式下是10000 次,超过这个阈值,就会触发 JIT 编译,阈值可以通过虚拟机参数 `-XX:CompileThreshold` 设置
1343013430
1343113431 工作流程:当一个方法被调用时, 会先检查该方法是否存在被 JIT 编译过的版本,存在则使用编译后的本地代码来执行;如果不存在则将此方法的调用计数器值加 1,然后判断方法调用计数器与回边计数器值之和是否超过方法调用计数器的阈值,如果超过阈值会向即时编译器提交一个该方法的代码编译请求
1343213432
@@ -13477,7 +13477,7 @@ VM 参数设置:
1347713477
1347813478- -client:指定 Java 虚拟机运行在 Client 模式下,并使用 C1 编译器
1347913479- -server:指定 Java 虚拟机运行在 Server 模式下,并使用 C2 编译器
13480- - `-server -XX:+TieredCompilation`:在1.8之前 ,分层编译默认是关闭的,可以添加该参数开启
13480+ - `-server -XX:+TieredCompilation`:在 1.8 之前 ,分层编译默认是关闭的,可以添加该参数开启
1348113481
1348213482分层编译策略 (Tiered Compilation):程序解释执行可以触发 C1 编译,将字节码编译成机器码,加上性能监控,C2 编译会根据性能监控信息进行激进优化,JVM 将执行状态分成了 5 个层次:
1348313483
@@ -13554,7 +13554,7 @@ public static int invoke(Object... args) {
1355413554
1355513555- 静态语言是判断变量自身的类型信息;动态类型语言是判断变量值的类型信息,变量没有类型信息
1355613556
13557- - **Java是静态类型语言 **(尽管lambda表达式为其增加了动态特性 ),js,python是动态类型语言
13557+ - **Java 是静态类型语言 **(尽管 lambda 表达式为其增加了动态特性 ),js,python是动态类型语言
1355813558
1355913559 ```java
1356013560 String s = "abc"; //Java
@@ -14735,15 +14735,6 @@ jstatd 是一个 RMI 服务端程序,相当于代理服务器,建立本地
1473514735
1473614736添加 JVM 参数选项:进入 Run/Debug Configurations → VM options 设置参数
1473714737
14738- 程序运行中:
14739-
14740- ```sh
14741- # 设置Boolean类型参数
14742- jinfo -flag [+|-]<name> <pid>
14743- # 设置非Boolean类型参数
14744- jinfo -flag <name>=<value> <pid>
14745- ```
14746-
1474714738* 标准参数选项:`java [-options] class [args...]` 或 `java [-options] -jar jarfile [args...]`
1474814739
1474914740 命令:`-? -help` 可以输出此命令的相关选项
@@ -14800,7 +14791,17 @@ jinfo -flag <name>=<value> <pid>
1480014791 -XX:<option>=<string> 设置option字符值
1480114792 ```
1480214793
14803-
14794+
14795+ 程序运行中:
14796+
14797+ ```sh
14798+ # 设置Boolean类型参数
14799+ jinfo -flag [+|-]<name> <pid>
14800+ # 设置非Boolean类型参数
14801+ jinfo -flag <name>=<value> <pid>
14802+ ```
14803+
14804+
1480414805
1480514806****
1480614807
@@ -14861,10 +14862,10 @@ jinfo -flag <name>=<value> <pid>
1486114862#### OOM参数
1486214863
1486314864```sh
14864- -XX:+HeapDumpOnOutMemoryError 内存出现OOM时生成Heap转储文件,两者互斥
14865- -XX:+HeapDumpBeforeFullGC 出现FullGC时生成Heap转储文件,两者互斥
14866- -XX:HeapDumpPath=<path> 指定heap转储文件的存储路径,默认当前目录
14867- -XX:OnOutOfMemoryError=<path> 指定可行性程序或脚本的路径,当发生OOM时执行脚本
14865+ -XX:+HeapDumpOnOutMemoryError 内存出现OOM时生成Heap转储文件,两者互斥
14866+ -XX:+HeapDumpBeforeFullGC 出现FullGC时生成Heap转储文件,两者互斥
14867+ -XX:HeapDumpPath=<path> 指定heap转储文件的存储路径,默认当前目录
14868+ -XX:OnOutOfMemoryError=<path> 指定可行性程序或脚本的路径,当发生OOM时执行脚本
1486814869```
1486914870
1487014871
@@ -15016,7 +15017,7 @@ Full GC 日志:
1501615017
1501715018- 括号外:GC 回收前年轻代和老年代大小 -> 回收后大小(年轻代和老年代总大小)
1501815019
15019- * Minor GC 堆内存总容量 = 9/10 年轻代 + 老年代,Survivor区只计算 from 部分,而 JVM 默认年轻代中 Eden 区和 Survivor 区的比例关系:Eden:S0:S1=8:1:1
15020+ * Minor GC 堆内存总容量 = 9/10 年轻代 + 老年代,Survivor 区只计算 from 部分,而 JVM 默认年轻代中 Eden 区和 Survivor 区的比例关系:Eden:S0:S1=8:1:1
1502015021
1502115022通过日志看 GC 时间:GC 日志中有三个时间 user、sys、real
1502215023
@@ -15605,18 +15606,19 @@ public class MergeSort {
1560515606 }
1560615607
1560715608 private static void merge(int[] arr, int low, int mid, int high) {
15608- int m = 0;
15609+ int index = 0;
1560915610 //定义左右指针
1561015611 int left = low, right = mid + 1;
1561115612 int[] assist = new int[high - low + 1];
15613+
1561215614 while (left <= mid && right <= high) {
15613- assist[m ++] = arr[left] < arr[right] ? arr[left++] : arr[right++];
15615+ assist[index ++] = arr[left] < arr[right] ? arr[left++] : arr[right++];
1561415616 }
1561515617 while (left <= mid) {
15616- assist[m ++] = arr[left++];
15618+ assist[index ++] = arr[left++];
1561715619 }
1561815620 while (right <= high) {
15619- assist[m ++] = arr[right++];
15621+ assist[index ++] = arr[right++];
1562015622 }
1562115623
1562215624 for (int k = 0; k < assist.length; k++) {
@@ -16479,6 +16481,7 @@ public void union(int p, int q) {
1647916481 }
1648016482 //让p所在树的节点根节点为q的所在的根节点,只需要把根节点改一下,时间复杂度 O(1)
1648116483 eleAndGroup[pRoot] = qRoot;
16484+ this.count-
1648216485}
1648316486```
1648416487
@@ -16793,7 +16796,7 @@ public class MGraph {
1679316796
1679416797### 工作流程
1679516798
16796- 向布隆过滤器中添加一个元素key时,会通过多个hash函数得到多个哈希值 ,在位数组中把对应下标的值置为 1
16799+ 向布隆过滤器中添加一个元素 key 时,会通过多个 hash 函数得到多个哈希值 ,在位数组中把对应下标的值置为 1
1679716800
1679816801
1679916802
0 commit comments