本内容分为三篇:

  • 上篇为 JVM - 内存与垃圾回收篇

  • 中篇为 JVM - 字节码与类的加载篇

  • 下篇为 JVM - 性能监控与调优篇

JVM - 内存与垃圾回收篇内容分为:

  • 类加载子系统:第 2 章(类加载子系统)
  • 运行时数据区:第 3 章(运行时数据区概述及线程) - 第 11 章(直接内容)
  • 执行引擎:第 12 章(执行引擎)
  • 面试常问:第 13 章(StringTable)
  • 垃圾回收机制:第 14 章(垃圾回收概述) - 第 17 章(垃圾回收期)

JVM - 字节码与类的加载篇内容为第 18 章 - 第 21 章。

JVM - 性能监控与调优篇内容为第 22 章 - 第 26章。

学习自 https://www.bilibili.com/video/BV1PJ411n7xZ

JVM - 内存与垃圾回收篇内容学习内容的顺序图(从上往下,中间是核心):

image-20200705080911284

# 技巧

# 技巧1

在开发中,能够使用 final 修饰的时候,建议使用上,因为在编译期间就确定值,提高效率。

# 技巧2

遇到多个 String 相加,应该换成 StringBuilder

public static void method1(int highLevel) {
    String src = "";
    for (int i = 0; i < highLevel; i++) {
        src += "a"; // 每次循环都会创建一个 StringBuilder 和 String 对象(应该避免)
    }
}

public static void method2(int highLevel) {
    // 只需要创建一个StringBuilder
    StringBuilder sb = new StringBuilder(); // 优化:StringBuilder s = new StringBuilder(highLevel);
    for (int i = 0; i < highLevel; i++) {
        sb.append("a");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法 1 耗费的时间:4005ms,方法 2 消耗时间:7ms。

方法 2 的再次优化:new StringBuilder() 构造器里可以传入参数(长度),所以为了避免后续长度不够的扩容,可以在创建的时候确定长度。

具体看 JVM - 拼接操作和append性能对比

# 参考

因为个人的时间原因,没有从头到尾完全手写笔记,而是参考了别人的一些笔记框架,然后在学习的途中,改成自己的布局和知识理解,这里注明参考的笔记来源:

  • 1 - 17 篇(部分)参考 https://gitee.com/moxi159753/LearningNotes/tree/master/JVM
  • 18 - 21 篇(部分)参考 https://www.zhihu.com/column/c_1303831719934214144
  • 22 - 26 篇(部分)参考 https://gitee.com/moxi159753/LearningNotes/tree/master/JVM
更新时间: 2024/01/17, 05:48:13
最近更新
01
JVM调优
12-10
02
jenkins
12-10
03
Arthas
12-10
更多文章>