ReZero's Utopia.

(转) JVM

Word count: 744Reading time: 2 min
2020/08/01 Share

本文内容笔记主要来自

  1. mashibing: http://www.mashibing.com/
  2. 以及深入理解JVM虚拟机
  3. 以及深入拆解Java虚拟机(郑雨迪)极客时间 https://time.geekbang.org/column/article/41245

编译

在 HotSpot 里面,上述翻译过程有两种形式:

第一种是解释执行,即逐条将字节码翻译成机器码并执行;

第二种是即时编译(Just-In-Time compilation,JIT),即将一个方法中包含的所有字节码编译成机器码后再执行。

Java 字节码

基本类型

在 Java 中,正无穷和负无穷是有确切的值,在内存中分别等同于十六进制整数 0x7F800000 和 0xFF800000。
[0x7F800001, 0x7FFFFFFF]和[0xFF800001, 0xFFFFFFFF] 对应的浮点数是 NaN(Not-a-Number)

1
2
3
4
5
6
7
8
9
10
11
12
13
14

public class Foo {
static boolean boolValue;
public static void main(String[] args) {
boolValue = true; // 将这个true替换为2或者3,再看看打印结果
if (boolValue) System.out.println("Hello, Java!");
if (boolValue == true) System.out.println("Hello, JVM!");
}
}

//当替换为2的时候无输出
//当替换为3的时候打印HelloJava及HelloJVM
//猜测是因为将boolean 保存在静态域中,指定了其类型为'Z'
//当修改为2时取低位最后一位为0,当修改为3时取低位最后一位为1则说明boolean的掩码处理是取低位的最后一位

类加载 查找字节流的过程

双亲委派模型

三个GC算法

  1. mark sweep: 标记清除,标记后进行清除,所以碎片化

  2. copy: 标记后统一整理放到一侧,然后对另一侧大扫除。由于 Eden 的特点是大量产生,大量销毁,因此很适用copy。使用时只需将Eden 少量存活的copy到 survivor1 中,然后对 Eden
    区进行清理即可。 等到二次回收时会将 eden 区的以及 survivor1 的一起复制到 survivor2 当中去。

  1. mark compact: 一边清一边压缩,时刻保持内存紧致。对于老年代这种对象一般都存活很久的就很适用。

10 个 Garbage collector

  • Epsilon: 跟进追踪,不做任何回收,常用来 debug 或者不需要回收的场景

分代模型

基本命令

  1. top 查内存占用

  1. jps 列出系统中java 的进程

  2. jinfo pid 拿到基本信息

  3. jstack pid | more 罗列出所有线程的调用栈状态

上面仨命令常用来定位 死锁


  1. jstat -gc 不好用,效果不直观

  2. arthas 基本命令:

    • dashboard 类似 top,能给出基本占用信息:如果是JVM没有报OOM便退出了,建议排查堆外内存
    • jvm 类似 jinfo 输出使用 JVM的相关信息比如使用的GC,memory 等
    • thread 类似 jstack,加 -b 参数可用于排查死锁
    • redefine 重定义 class 类似字节码插桩
  3. jmap -histo pid 定位哪些对象在吃内存

    • jmap -dump:format=b.file=xxx.hprof 2366

实际实例 https://mp.weixin.qq.com/s?__biz=Mzg3MTEyMjUyMQ==&mid=2247483765&idx=1&sn=1c20adaae37a9c11bed1c3d2964909d0&chksm=ce821243f9f59b55eec0ebf5beb3d660668151bd46c03ded25c0fd731c3ff188faea3c0b3c53&mpshare=1&scene=23&srcid=0827zNKbMDdpJCoIv9omeEZs&sharer_sharetime=1598580051461&sharer_shareid=162a8816dfe520fecd477f663aaf4f98#rd

OQL 学习

CATALOG
  1. 1. 编译
  • Java 字节码
  • 基本类型
  • 类加载 查找字节流的过程
    1. 1. 三个GC算法
    2. 2. 10 个 Garbage collector
      1. 2.1. 分代模型
      2. 2.2. 基本命令
      3. 2.3. OQL 学习