🔄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