本文内容笔记主要来自
- mashibing: http://www.mashibing.com/
- 以及深入理解JVM虚拟机
- 以及深入拆解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 |
|
类加载 查找字节流的过程
双亲委派模型
三个GC算法
mark sweep: 标记清除,标记后进行清除,所以碎片化
copy: 标记后统一整理放到一侧,然后对另一侧大扫除。由于 Eden 的特点是大量产生,大量销毁,因此很适用copy。使用时只需将Eden 少量存活的copy到 survivor1 中,然后对 Eden
区进行清理即可。 等到二次回收时会将 eden 区的以及 survivor1 的一起复制到 survivor2 当中去。

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

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

基本命令
- top 查内存占用
jps 列出系统中java 的进程
jinfo pid 拿到基本信息
jstack pid | more 罗列出所有线程的调用栈状态
上面仨命令常用来定位 死锁
jstat -gc 不好用,效果不直观
arthas 基本命令:
- dashboard 类似 top,能给出基本占用信息:如果是JVM没有报OOM便退出了,建议排查堆外内存
- jvm 类似 jinfo 输出使用 JVM的相关信息比如使用的GC,memory 等
- thread 类似 jstack,加 -b 参数可用于排查死锁
- redefine 重定义 class 类似字节码插桩
jmap -histo pid 定位哪些对象在吃内存
- jmap -dump:format=b.file=xxx.hprof 2366