🔄Update: JVM
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
# JIT
|
||||
|
||||
热点代码 -> 机器码
|
||||
|
||||

|
||||
|
||||
- C1
|
||||
- `Client Complier`
|
||||
- 局部简单可靠优化
|
||||
- C2
|
||||
- `Server Complier`
|
||||
- 全局优化
|
||||
@@ -0,0 +1,40 @@
|
||||
# 命令行
|
||||
|
||||
## jps
|
||||
|
||||
查看虚拟机进程
|
||||
|
||||
```sh
|
||||
C:\Users\23117>jps -l
|
||||
6048 org.jetbrains.jps.cmdline.Launcher
|
||||
10372 sun.tools.jps.Jps
|
||||
4228 cn.hezhaohui.app
|
||||
9832 com.intellij.idea.Main
|
||||
```
|
||||
|
||||
`jps -l` 命令列出的 Java 进程如下:
|
||||
|
||||
- `6048` - `org.jetbrains.jps.cmdline.Launcher`(JetBrains 项目构建工具)
|
||||
- `10372` - `sun.tools.jps.Jps`(`jps` 自身进程)
|
||||
- `4228` - `cn.hezhaohui.app`(自定义 Java 应用程序)
|
||||
- `9832` - `com.intellij.idea.Main`(IntelliJ IDEA 主程序)
|
||||
|
||||
## jstats
|
||||
|
||||
```sh
|
||||
C:\Users\23117>jstat -class -t 14988 1000 2
|
||||
Timestamp Loaded Bytes Unloaded Bytes Time
|
||||
57.7 902 2124.9 0 0.0 0.03
|
||||
58.7 902 2124.9 0 0.0 0.03
|
||||
```
|
||||
|
||||
`jstat -class -t 14988 1000 2` 的输出表示:
|
||||
|
||||
- **Timestamp**:时间戳(单位为秒)。
|
||||
- **Loaded**:已加载的类数量(902 个)。
|
||||
- **Bytes**:已加载类的总字节数(2124.9 KB)。
|
||||
- **Unloaded**:已卸载的类数量(0 个)。
|
||||
- **Bytes**:已卸载类的总字节数(0.0 KB)。
|
||||
- **Time**:类加载/卸载所花费的时间(0.03 秒)。
|
||||
|
||||
此命令用于监控 Java 进程(PID 14988)的类加载统计信息,每秒输出一次,共输出 2 次。
|
||||
@@ -0,0 +1,23 @@
|
||||
# OOM
|
||||
|
||||
> OOM: Out of Memory
|
||||
> 内存溢出:申请内存时, JVM 没有足够的内存空间
|
||||
> ML: Memory Leak
|
||||
> 内存泄漏:申请了内存,但是没有释放,导致内存空间浪费
|
||||
|
||||
|
||||
- 合理设置堆内存大小
|
||||
- 内存分析工具排查问题
|
||||
- GC 日志分析
|
||||
- 控制缓存
|
||||
|
||||
|
||||
**容易出现 OOM 的业务场景**
|
||||
|
||||
- 处理大量图片、文件、大数据集未及时释放
|
||||
- 内存泄漏,数据库连接未关闭、缓存未清理
|
||||
- 缓存没有限制大小
|
||||
- 线程数量过多
|
||||
- 无限递归
|
||||
- 强引用过多
|
||||
- 一次性处理大文件
|
||||
@@ -0,0 +1,7 @@
|
||||
# 双亲委派模型
|
||||
|
||||
- 过程
|
||||
- 父类加载器先尝试加载
|
||||
- 父类加载器不能加载,则自己加载
|
||||
- 优点
|
||||
- 保证类的统一性和安全性,避免被重复佳作或者被篡改
|
||||
@@ -0,0 +1,18 @@
|
||||
# 类加载过程
|
||||
|
||||
1. 加载
|
||||
1. 通过全类名获取定义此类的二进制字节流
|
||||
2. 将字节流的静态存储结构转化为运行时数据结构
|
||||
3. 在内存中生成 `Class` 对象,放入方法区中
|
||||
2. 验证
|
||||
1. 文件格式验证 (魔数)
|
||||
2. 元数据验证 (符合规范)
|
||||
3. 字节码验证 (程序语义)
|
||||
4. 符号引用验证 (其他类、方法、字段是否存在)
|
||||
3. 准备
|
||||
1. 分配内存
|
||||
- 静态变量
|
||||
4. 解析
|
||||
1. 将符号引用替换为直接引用
|
||||
5. 初始化
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
# 创建对象
|
||||
|
||||
**初始化顺序**
|
||||
|
||||
1. 父类静态变量/静态代码块
|
||||
2. 子类静态变量/静态代码块
|
||||
3. 父类变量/代码块
|
||||
4. 父类构造方法
|
||||
5. 子类变量/代码块
|
||||
6. 子类构造方法
|
||||
|
||||
```java
|
||||
class Parent {
|
||||
// 父类静态变量
|
||||
static {
|
||||
System.out.println("1. 父类静态代码块");
|
||||
}
|
||||
|
||||
// 父类实例变量
|
||||
{
|
||||
System.out.println("3. 父类实例代码块");
|
||||
}
|
||||
|
||||
// 父类构造方法
|
||||
Parent() {
|
||||
System.out.println("4. 父类构造方法");
|
||||
}
|
||||
}
|
||||
|
||||
class Child extends Parent {
|
||||
// 子类静态变量
|
||||
static {
|
||||
System.out.println("2. 子类静态代码块");
|
||||
}
|
||||
|
||||
// 子类实例变量
|
||||
{
|
||||
System.out.println("5. 子类实例代码块");
|
||||
}
|
||||
|
||||
// 子类构造方法
|
||||
Child() {
|
||||
System.out.println("6. 子类构造方法");
|
||||
}
|
||||
}
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
new Child();
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
Reference in New Issue
Block a user