mirror of
https://github.com/Estom/notes.git
synced 2026-02-02 18:20:20 +08:00
shell
This commit is contained in:
301
Java基础教程/Java性能优化/Jstat性能优化工具.md
Normal file
301
Java基础教程/Java性能优化/Jstat性能优化工具.md
Normal 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:可以在周期性数据输出的时候,指定输出多少行以后输出一次表头
|
||||
vmid:Virtual 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(伊甸园)目前已使用空间 (字节)
|
||||
* OC:Old代的容量 (字节)
|
||||
* OU:Old代目前已使用空间 (字节)
|
||||
* MC:metaspace(元空间)的容量 (字节)
|
||||
* MU:metaspace(元空间)目前已使用空间 (字节)
|
||||
* 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(伊甸园)的容量 (字节)
|
||||
* OGCMN:old代中初始化(最小)的大小 (字节)
|
||||
* OGCMX:old代的最大容量(字节)
|
||||
* OGC:old代当前新生成的容量 (字节)
|
||||
* OC:Old代的容量 (字节)
|
||||
* MCMN:metaspace(元空间)中初始化(最小)的大小 (字节)
|
||||
* MCMX:metaspace(元空间)的最大容量 (字节)
|
||||
* MC:metaspace(元空间)当前新生成的容量 (字节)
|
||||
* 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
|
||||
```
|
||||
|
||||
* MC:metaspace(元空间)的容量 (字节)
|
||||
* MU:metaspace(元空间)目前已使用空间 (字节)
|
||||
* CCSC:压缩类空间大小
|
||||
* CCSU:压缩类空间使用大小
|
||||
* OC:Old代的容量 (字节)
|
||||
* OU:Old代目前已使用空间 (字节)
|
||||
* 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
|
||||
```
|
||||
* OGCMN:old代中初始化(最小)的大小 (字节)
|
||||
* OGCMX:old代的最大容量(字节)
|
||||
* OGC:old代当前新生成的容量 (字节)
|
||||
* OC:Old代的容量 (字节)
|
||||
* 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(伊甸园)已使用的占当前容量百分比
|
||||
* O:old代已使用的占当前容量百分比
|
||||
* 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
|
||||
```
|
||||
BIN
Java基础教程/Java性能优化/image/2022-08-31-17-25-27.png
Normal file
BIN
Java基础教程/Java性能优化/image/2022-08-31-17-25-27.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
46
Java基础教程/Java性能优化/jvm gc机制说明.md
Normal file
46
Java基础教程/Java性能优化/jvm gc机制说明.md
Normal file
@@ -0,0 +1,46 @@
|
||||
## 1 GC的方式与过程
|
||||
> 参考文档 https://blog.51cto.com/u_14962799/2739752
|
||||
> 关键词:伊甸园区,幸存区,年轻代,年老代,持久代
|
||||
|
||||

|
||||
|
||||
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 GC:Full 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:PermSize(1.8之后改为MetaspaceSize) 设置持久代(perm gen)初始值,默认是物理内存的1/64。
|
||||
-XX:MaxPermSize=n:(1.8之后改为MaxMetaspaceSize)设置最大持久代大小。
|
||||
-Xss:每个线程的堆栈大小。所有当项目经常发生栈内存溢出(stackOverflowErro)时,可以考虑增加该参数大小
|
||||
```
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -18,7 +18,11 @@
|
||||
|
||||
### 异常的层次
|
||||
|
||||
Java程序在执行过程中所发生的异常(广义上的一切不正常)事件可分为两类—Error和Exception
|
||||
|
||||
* Error:Java虚拟机无法解决的严重问题,一般不编写针对性代码进行处理。会出现Error的情况一般是内存空间不够,JVM系统内部错误,资源耗尽等等严重问题。(本文我们不讨论Error的问题)
|
||||
|
||||
* Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理,即使用java的异常处理机制,控制后面的代码继续执行。(本文我们只讨论在编译程序时出现最多的Exception问题)
|
||||
|
||||
Throwable 可以用来表示任何可以作为异常抛出的类,分为两种: **Error** 和 **Exception**。其中 Error 用来表示 JVM 无法处理的错误,Error 用来指示运行时环境发生的错误,程序不会从Error中恢复,而是直接down掉。Exception 分为两种:
|
||||
|
||||
|
||||
18
Linux/Linux工具命令/0工具命令.md
Normal file
18
Linux/Linux工具命令/0工具命令.md
Normal 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 字符排序命令
|
||||
@@ -35,7 +35,7 @@
|
||||
* Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
|
||||
* ESC,退出输入模式,切换到命令模式
|
||||
|
||||
### 底线命令模式
|
||||
### 底行命令模式
|
||||
在命令模式下按下:(英文冒号)就进入了底线命令模式。
|
||||
|
||||
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user