This commit is contained in:
法然
2022-10-03 00:08:52 +08:00
parent 16a1e2ce10
commit dd11a44b1f
647 changed files with 10830 additions and 308 deletions

View File

@@ -0,0 +1,301 @@
> 参考文献https://blog.csdn.net/javalingyu/article/details/124800644
## 1 简介
Jstat名称Java Virtual Machine statistics monitoring tool
官方文档:
https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
功能介绍:
Jstat是JDK自带的一个轻量级小工具。它位于java的bin目录下主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控包括了对Heap size和垃圾回收状况的监控。
## 2 用法
### 使用说明
```
C:\Users\Administrator>jstat -help
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
Definitions:
<option> An option reported by the -options option
<vmid> Virtual Machine Identifier. A vmid takes the following form:
<lvmid>[@<hostname>[:<port>]]
Where <lvmid> is the local vm identifier for the target
Java virtual machine, typically a process id; <hostname> is
the name of the host running the target Java virtual machine;
and <port> is the port number for the rmiregistry on the
target host. See the jvmstat documentation for a more complete
description of the Virtual Machine Identifier.
<lines> Number of samples between header lines.
<interval> Sampling interval. The following forms are allowed:
<n>["ms"|"s"]
Where <n> is an integer and the suffix specifies the units as
milliseconds("ms") or seconds("s"). The default units are "ms".
<count> Number of samples to take before terminating.
```
### 参数说明
```java
option参数选项
-class 用于查看类加载情况的统计,包括已经加载和未加载的类
-compiler 用于查看HotSpot中即时编译器编译情况的统计
-gc 用于查看JVM中堆的垃圾收集情况的统计
-gccapacity 用于查看新生代老生代及持久代的存储容量情况
-gcmetacapacity 显示metaspace的大小
-gcnew 用于查看新生代垃圾收集的情况
-gcnewcapacity 用于查看新生代存储容量的情况
-gcold 用于查看老生代及持久代垃圾收集的情况
-gcoldcapacity 用于查看老生代的容量
-gcutil 显示垃圾收集信息
-gccause 显示垃圾回收的相关信息-gcutil,同时显示最后一次仅当前正在发生的垃圾收集的原因
-printcompilation 输出JIT编译的方法信息
-t可以在打印的列加上Timestamp列用于显示系统运行的时间
-h可以在周期性数据输出的时候指定输出多少行以后输出一次表头
vmidVirtual Machine ID 进程的 pid
interval执行每次的间隔时间单位为毫秒
count用于指定输出多少次记录缺省则会一直打印
```
### 1.-class类加载统计
```
[root@hadoop ~]# jps #先通过jps获取到java进程号这里是一个zookeeper进程
3346 QuorumPeerMain
7063 Jps
[root@hadoop ~]# jstat -class 3346 #统计JVM中加载的类的数量与size
Loaded Bytes Unloaded Bytes Time
1527 2842.7 0 0.0 1.02
```
* Loaded:加载类的数量
* Bytes加载类的size单位为Byte
* Unloaded卸载类的数目
* Bytes卸载类的size单位为Byte
* Time加载与卸载类花费的时间
### 2.-compiler 编译统计
```
[root@hadoop ~]# jstat -compiler 3346 #用于查看HotSpot中即时编译器编译情况的统计
Compiled Failed Invalid Time FailedType FailedMethod
404 0 0 0.19 0
```
* Compiled编译任务执行数量
* Failed编译任务执行失败数量
* Invalid编译任务执行失效数量
* Time编译任务消耗时间
* FailedType最后一个编译失败任务的类型
* FailedMethod最后一个编译失败任务所在的类及方法
### 3.-gc 垃圾回收统计
```
[root@hadoop ~]# jstat -gc 3346 #用于查看JVM中堆的垃圾收集情况的统计
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
128.0 128.0 0.0 128.0 1024.0 919.8 15104.0 2042.4 8448.0 8130.4 1024.0 996.0 7 0.019 0 0.000 0.019
```
* S0C年轻代中第一个survivor幸存区的容量 (字节)
* S1C年轻代中第二个survivor幸存区的容量 (字节)
* S0U年轻代中第一个survivor幸存区目前已使用空间 (字节)
* S1U年轻代中第二个survivor幸存区目前已使用空间 (字节)
* EC年轻代中Eden伊甸园的容量 (字节)
* EU年轻代中Eden伊甸园目前已使用空间 (字节)
* OCOld代的容量 (字节)
* OUOld代目前已使用空间 (字节)
* MCmetaspace(元空间)的容量 (字节)
* MUmetaspace(元空间)目前已使用空间 (字节)
* CCSC当前压缩类空间的容量 (字节)
* CCSU当前压缩类空间目前已使用空间 (字节)
* YGC从应用程序启动到采样时年轻代中gc次数
* YGCT从应用程序启动到采样时年轻代中gc所用时间(s)
* FGC从应用程序启动到采样时old代(全gc)gc次数
* FGCT从应用程序启动到采样时old代(全gc)gc所用时间(s)
* GCT从应用程序启动到采样时gc用的总时间(s)
### 4.-gccapacity 堆内存统计
```
[root@hadoop ~]# jstat -gccapacity 3346 #用于查看新生代、老生代及持久代的存储容量情况
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0
[root@hadoop ~]# jstat -gccapacity -h5 3346 1000 #-h5每5行显示一次表头 1000每1秒钟显示一次单位为毫秒
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0
1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0
1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0
1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0
1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0
1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0
1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0
1280.0 83264.0 1280.0 128.0 128.0 1024.0 15104.0 166592.0 15104.0 15104.0 0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 7 0
```
* NGCMN年轻代(young)中初始化(最小)的大小(字节)
* NGCMX年轻代(young)的最大容量 (字节)
* NGC年轻代(young)中当前的容量 (字节)
* S0C年轻代中第一个survivor幸存区的容量 (字节)
* S1C年轻代中第二个survivor幸存区的容量 (字节)
* EC年轻代中Eden伊甸园的容量 (字节)
* OGCMNold代中初始化(最小)的大小 (字节)
* OGCMXold代的最大容量(字节)
* OGCold代当前新生成的容量 (字节)
* OCOld代的容量 (字节)
* MCMNmetaspace(元空间)中初始化(最小)的大小 (字节)
* MCMXmetaspace(元空间)的最大容量 (字节)
* MCmetaspace(元空间)当前新生成的容量 (字节)
* CCSMN最小压缩类空间大小
* CCSMX最大压缩类空间大小
* CCSC当前压缩类空间大小
* YGC从应用程序启动到采样时年轻代中gc次数
* FGC从应用程序启动到采样时old代(全gc)gc次数
### 5.-gcmetacapacity 元数据空间统计
```
[root@hadoop ~]# jstat -gcmetacapacity 3346 #显示元数据空间的大小
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1056768.0 8448.0 0.0 1048576.0 1024.0 8 0 0.000 0.020
```
* MCMN最小元数据容量
* MCMX最大元数据容量
* MC当前元数据空间大小
* CCSMN最小压缩类空间大小
* CCSMX最大压缩类空间大小
* CCSC当前压缩类空间大小
* YGC从应用程序启动到采样时年轻代中gc次数
* FGC从应用程序启动到采样时old代(全gc)gc次数
* FGCT从应用程序启动到采样时old代(全gc)gc所用时间(s)
* GCT从应用程序启动到采样时gc用的总时间(s)
### 6.-gcnew 新生代垃圾回收统计
```
[root@hadoop ~]# jstat -gcnew 3346 #用于查看新生代垃圾收集的情况
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
128.0 128.0 67.8 0.0 1 15 64.0 1024.0 362.2 8 0.020  
```
* S0C年轻代中第一个survivor幸存区的容量 (字节)
* S1C年轻代中第二个survivor幸存区的容量 (字节)
* S0U年轻代中第一个survivor幸存区目前已使用空间 (字节)
* S1U年轻代中第二个survivor幸存区目前已使用空间 (字节)
* TT持有次数限制
* MTT最大持有次数限制
* DSS期望的幸存区大小
* EC年轻代中Eden伊甸园的容量 (字节)
* EU年轻代中Eden伊甸园目前已使用空间 (字节)
* YGC从应用程序启动到采样时年轻代中gc次数
* YGCT从应用程序启动到采样时年轻代中gc所用时间(s)
### 7.-gcnewcapacity 新生代内存统计
```
[root@hadoop ~]# jstat -gcnewcapacity 3346 #用于查看新生代存储容量的情况
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
1280.0 83264.0 1280.0 8320.0 128.0 8320.0 128.0 66624.0 1024.0 8 0
```
* NGCMN年轻代(young)中初始化(最小)的大小(字节)
* NGCMX年轻代(young)的最大容量 (字节)
* NGC年轻代(young)中当前的容量 (字节)
* S0CMX年轻代中第一个survivor幸存区的最大容量 (字节)
* S0C年轻代中第一个survivor幸存区的容量 (字节)
* S1CMX年轻代中第二个survivor幸存区的最大容量 (字节)
* S1C年轻代中第二个survivor幸存区的容量 (字节)
* ECMX年轻代中Eden伊甸园的最大容量 (字节)
* EC年轻代中Eden伊甸园的容量 (字节)
* YGC从应用程序启动到采样时年轻代中gc次数
* FGC从应用程序启动到采样时old代(全gc)gc次数
### 8.-gcold 老年代垃圾回收统计
```
[root@hadoop ~]# jstat -gcold 3346 #用于查看老年代及持久代垃圾收集的情况
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
8448.0 8227.5 1024.0 1003.7 15104.0 2102.2 8 0 0.000 0.020 
```
* MCmetaspace(元空间)的容量 (字节)
* MUmetaspace(元空间)目前已使用空间 (字节)
* CCSC压缩类空间大小
* CCSU压缩类空间使用大小
* OCOld代的容量 (字节)
* OUOld代目前已使用空间 (字节)
* YGC从应用程序启动到采样时年轻代中gc次数
* FGC从应用程序启动到采样时old代(全gc)gc次数
* FGCT从应用程序启动到采样时old代(全gc)gc所用时间(s)
* GCT从应用程序启动到采样时gc用的总时间(s)
### 9.-gcoldcapacity 老年代内存统计
```
[root@hadoop ~]# jstat -gcoldcapacity 3346 #用于查看老年代的容量
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
15104.0 166592.0 15104.0 15104.0 8 0 0.000 0.020
```
* OGCMNold代中初始化(最小)的大小 (字节)
* OGCMXold代的最大容量(字节)
* OGCold代当前新生成的容量 (字节)
* OCOld代的容量 (字节)
* YGC从应用程序启动到采样时年轻代中gc次数
* FGC从应用程序启动到采样时old代(全gc)gc次数
* FGCT从应用程序启动到采样时old代(全gc)gc所用时间(s)
* GCT从应用程序启动到采样时gc用的总时间(s)
### 10.-gcutil 垃圾回收统计
```
[root@hadoop ~]# jstat -gcutil 3346 #显示垃圾收集信息
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
52.97 0.00 42.10 13.92 97.39 98.02 8 0.020 0 0.000 0.020 
```
* S0年轻代中第一个survivor幸存区已使用的占当前容量百分比
* S1年轻代中第二个survivor幸存区已使用的占当前容量百分比
* E年轻代中Eden伊甸园已使用的占当前容量百分比
* Oold代已使用的占当前容量百分比
* M元数据区已使用的占当前容量百分比
* CCS压缩类空间已使用的占当前容量百分比
* YGC 从应用程序启动到采样时年轻代中gc次数
* YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
* FGC 从应用程序启动到采样时old代(全gc)gc次数
* FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
* GCT从应用程序启动到采样时gc用的总时间(s)
### 11.-gccause
```
[root@hadoop ~]# jstat -gccause 3346 #显示垃圾回收的相关信息(通-gcutil,同时显示最后一次或当前正在发生的垃圾回收的诱因
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
52.97 0.00 46.09 13.92 97.39 98.02 8 0.020 0 0.000 0.020 Allocation Failure No GC
```
* LGCC最后一次GC原因
* GCC当前GC原因No GC 为当前没有执行GC
### 12.-printcompilation JVM编译方法统计
```
[root@hadoop ~]# jstat -printcompilation 3346 #输出JIT编译的方法信息
Compiled Size Type Method
421 60 1 sun/nio/ch/Util$2 clear
```
* Compiled编译任务的数目
* Size方法生成的字节码的大小
* Type编译类型
* Method类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的
### 远程监控
与jps一样jstat也支持远程监控同样也需要开启安全授权方法参照jps。
```
C:\Users\Administrator>jps 192.168.146.128
3346 QuorumPeerMain
3475 Jstatd
C:\Users\Administrator>jstat -gcutil 3346@192.168.146.128
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
52.97 0.00 65.15 13.92 97.39 98.02 8 0.020 0 0.000 0.020
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

View File

@@ -0,0 +1,46 @@
## 1 GC的方式与过程
> 参考文档 https://blog.51cto.com/u_14962799/2739752
> 关键词:伊甸园区,幸存区,年轻代,年老代,持久代
![](image/2022-08-31-17-25-27.png)
JVM内存的大致结构
* 年轻代young generation
* 两个幸存区survivor
* 一个伊甸区eden
* 老年代old generation
* 吃就带perm
GC的工作过程
1. 持久代:当类加载时,我们会将.class文件中的部分信息加载到持久区中比如类的修饰符字段属性和方法信息等。又或者时import引入类的信息。都叫持久代了也就说明这块区间的内存相对稳定垃圾回收一般也就没持久代啥事儿。
2. 伊甸园区伊甸园区好理解希腊神话中人类诞生的地方。因此当我们创建对象时比如new String("123")即JVM在伊甸园区创建了一个对象对象里面装的是String类型的数据123。
3. 幸存区当伊甸园区的内存占满了而又需要创建对象时JVM就会像伊甸园区还活着的被引用的对象拷贝到幸存区去。此时其实会调用一此Minor GC操作也可以称为迷你的垃圾回收动作该动做就会将没有被引用的对象回收了。然后程序继续运行当伊甸园和其中一个幸存区幸存区1都满了的时候此时又会执行一次Minor GC该次垃圾回收会将伊甸园区和幸存区1中所有还活着的对象(仍然被引用的)复制到幸存区2中然后将没有用的对象回收。
4. 老年代当需要创建对象而伊甸园区和幸存区都装满了的时候就会将年轻代活着的的对象复制到老年代中此时又会唤起Minor GC操作将没有被引用的对象回收。但是我们常讨论的其实还是Full GC即当老年代内存占满了的时候JVM会触发Full GC也就是重量级的垃圾回收机制。
5. Full GCFull GC会对年轻代年老代持久代的对象进行全面回收。但是垃圾回收线程并不会中断其他的线程而是并发执行的。在真正回收垃圾之前会先根据根搜索算法找到可以回收的对象并对其进行标记。但是如果先将对象标记了可回收但是后面有给这个指向null的对象str指向了“123”这块内存时这个对象就不应该被回收。那么就会出现这个对象到底应不应该回收的问题。JVM为了解决这个问题会在一些特定的位置上设置一些“安全点”比如容易抛异常的地方或者循环的末尾当垃圾回收进程运行到这些安全点时就会执行stop the word命令暂停所有线程只运行垃圾回收线程。这也就是内存满了容易卡的原因。当堆内存快要用完时就会Full GC此时可能会出发stop the word当GC之后内存还是不够用此时还会再次执行Full GC此时还有可能会触发stop the word。因此我们需要合理的写代码尽量避免创建不用的对象以及避免无用对象无法回收当然配置好堆内存的各个区的比例按需配置也是必要的。也可以简单的来说JVM调优在一定程度上就是配置堆内存中各个区间的大小。
## 2 如何判断单对象是否可以回收
1. 早期的JDK采用的是“引用计数法”来判断对象是否可以被回收。当一个对象被创建时其计数为0当其被a引用时计数+1但是当a = null计数-1那么当计数为0时该对象即可被回收但是这样子的算法有个缺陷就是循环引用的对象无法被回收。
2. 后来改用“根搜索算法”标记可回收对象,将根节点不可达的对象进行标记。
## 3 何时Full GC呢
1老年代被写满了
2持久代被写满了
3当调用了system.gc();
4当用命令分配堆空间的运行策略时比如设置年轻代和老年代的比例。如果JVM发现上次GC后这种运行策略有了变化就会触发GC。
## 4 JVM调优调整哪些参数
```
-Xms:初始堆大小默认是物理内存的1/64。默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时JVM就会增大堆直到Xmx的最大限制。例如-Xms 500m。
-Xmx:最大堆大小。默认是物理内存的1/4 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时JVM会减少堆直到 -Xms的最小限制。
-XX:NewSize设置年轻代大小初始值
-XX:MaxNewSize设置年轻代最大值。
**-XX:NewRatio=n设置年轻代和年老代的比值。一般设置为4
-XX:SurvivorRatio=n年轻代中Eden区与两个Survivor区的比值。
-XX:PermSize1.8之后改为MetaspaceSize 设置持久代(perm gen)初始值默认是物理内存的1/64。
-XX:MaxPermSize=n:1.8之后改为MaxMetaspaceSize设置最大持久代大小。
-Xss每个线程的堆栈大小。所有当项目经常发生栈内存溢出(stackOverflowErro)时,可以考虑增加该参数大小
```

View File

@@ -0,0 +1,37 @@
package com.ykl.stacktrace;
import java.lang.System;
import java.lang.RuntimeException;
import java.lang.Thread;
import java.util.stream.Stream;
public class PrintTrackTest {
void printTrackTest() {
// 1.打印调用堆栈
RuntimeException e = new RuntimeException("print stacktrace");
// e.fillInStackTrace();
System.out.println("1.打印调用堆栈");
Stream.of(e.getStackTrace()).forEach(System.out::println);
// 2.打印调用堆栈
System.out.println("2.打印调用堆栈");
Stream.of(Thread.currentThread().getStackTrace()).forEach(System.out::println);
}
public void first_method(){
second_method();
}
public void second_method(){
printTrackTest();
}
public static void main(String[] args) {
new PrintTrackTest().first_method();
}
}

View File

@@ -18,7 +18,11 @@
### 异常的层次
Java程序在执行过程中所发生的异常广义上的一切不正常事件可分为两类—Error和Exception
* ErrorJava虚拟机无法解决的严重问题一般不编写针对性代码进行处理。会出现Error的情况一般是内存空间不够JVM系统内部错误资源耗尽等等严重问题。本文我们不讨论Error的问题
* Exception其它因编程错误或偶然的外在因素导致的一般性问题可以使用针对性代码进行处理即使用java的异常处理机制控制后面的代码继续执行。(本文我们只讨论在编译程序时出现最多的Exception问题)
Throwable 可以用来表示任何可以作为异常抛出的类,分为两种: **Error****Exception**。其中 Error 用来表示 JVM 无法处理的错误Error 用来指示运行时环境发生的错误程序不会从Error中恢复而是直接down掉。Exception 分为两种:

View File

@@ -0,0 +1,18 @@
## 文本查看和处理
### 交互式
- [x] vim
- [x] less
### 编辑
- [x] sed
### 查看
- [x] cat
- [x] head
- [x] tail
- [x] cut
- [x] wc 统计行数、单词数、字符数
- [x] uniq 去掉临近重复行
- [x] sort 字符排序命令

View File

@@ -35,7 +35,7 @@
* Insert切换光标为输入/替换模式,光标将变成竖线/下划线
* ESC退出输入模式切换到命令模式
### 底线命令模式
### 底命令模式
在命令模式下按下:(英文冒号)就进入了底线命令模式。
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。

Some files were not shown because too many files have changed in this diff Show More