1. 7.1 学习资源historical

    24个Jvm面试题总结及答案 \- 掘金

  2. 7.2 Java线上问题排查historical

    1. 内存占用100% / 内存问题 1.1. 查找Java进程ID top 命令,按下 M 查看哪个java进程占用内存最高 1.2. 分析是否发生OOM OOM问题举例.md 2. CPU占用100% / 线程问题 2.1. 查找Java进程ID和线程ID 1. top 命令,按下 P 查看哪个

  3. 7.3 1.垃圾回收思想historical

    1. 引用计数法 每个对象都有一个计数器,有变量引用时+1,引用失效则-1。当计数器为0的时候则对其进行回收 优点:简单高效 缺点:无法解决循环引用的问题 循环引用是指A对象引用B对象,B对象又引用A对象,但是A,B对象已不被任何其他对象引用 2. 可达性分析 从GC Root出发,通过引用关系遍历

  4. 7.4 类生命周期historical

    1. 类生命周期 主要有加载、连接、初始化、使用、卸载这几个步骤 1.1. 加载 当我们的代码需要使用一个类的时候,这个类不在JVM中的时候就会加载 1.1.1. 由谁加载 由类加载器负责加载类加载器 1.1.1.1. 类加载器分类 - 启动类加载器负责加载JAVA HOME/lib - 扩展类加载

  5. 7.5 内存分区historical

    1. JVM内存分区 1.1. 线程共享 1.1.1. 堆 - 在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。之所以说几乎所有,不是说所有的是因为较新版本的Java(从Java 6的某个更新开始)中,由于JIT编译器的发展和”逃逸分析”技术的逐渐成熟,

  6. 7.6 调优思路historical

    1. 调优的目的 减少Full GC的次数/降低Full GC耗时/降低内存占用 所谓JVM优化,就是尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收 2. 生产上整体步骤 2.1. 观察应用的G

  7. 7.7 2.垃圾回收算法historical

    1. 标记清除 垃圾回收分成两个阶段 - 标记: 从GC Root出发,标记所有可达的对象。未被标记的就是垃圾对象 - 清除: 清除所有未被标记的对象 1.1. 特点 - 会产生内存碎片(不连续的内存空间), 需要分配较大的对象时,无法找到足够的连续内存空间。 2. 标记整理 分标记和整理阶段。 -

  8. 7.8 类初始化顺序historical

    1. 什么时候会触发初始化 new一个实例或者main方法所在类 2. 初始化规则 如果父类没有初始化,那么首先初始化父类 3. 举例 3.1. 单个类的情况 - 结果 3.2. 继承的情况 - 结果 4. 参考 - Java类初始化顺序 \- code\-craft \- SegmentFault

  9. 7.9 对象分配规则historical

    1. 规则 - 对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。 - 大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。 - 长期存活的对

  10. 7.10 3.垃圾回收器historical

    1. JVM实际采用的垃圾回收算法:分代收集 根据对象的存活时间把内存分成新生代和老年代 - 新生代的特点是每次回收只有少量对象存活,因此采用改进的复制算法 改进的复制算法把内存空间分为Eden和Survivor区(8:1:1),只有10%的空间被浪费 - 老年代的特点是有大量对象存活,采用标记清除

  11. 7.11 自定义类加载器historical

    1. 什么时候需要自定义类加载器 - 加载任意路径(比如非classpath)下的类文件 - 隔离加载类。这样不同应用的同名类都可以加载,比如tomcat 2. 如何自定义类加载器 1. 继承ClassLoader父类 2. 重写父类的方法 1. 如果走双亲委派机制那么重写 findClass 方法

  12. 7.12 逃逸分析historical

    1. 逃逸分析是什么 就是分析一个对象的作用域。 逃逸有两种: - 方法逃逸:在本方法中定义的对象可以被外部方法访问 - 线程逃逸:在本线程中定义的对象可以被其他线程访问 2. 如何开启 逃逸分析的 JVM 参数如下: - 开启逃逸分析:-XX:+DoEscapeAnalysis - 关闭逃逸分析:

  13. 7.13 4.jvm参数选用具体的垃圾回收器historical

    1. 新生代与老年代的匹配 2. JVM参数 -XX:+UseSerialGC 新生代使用Serial(复制算法),老年代使用Serial Old(标记整理) -XX:+UseParNewGC 新生代使用ParNew(复制算法),老年代使用Serial Old(标记整理) -XX:UseParall

  14. 7.14 对象的创建过程historical

    1. 代码 2. 字节码 2.1. 解释 可以看出 Test test = new Test(); 分成三个步骤 1. 创建Test实例 2. 对Test实例的属性val赋值 3. 把Test实例的引用赋值给test变量 第一个步骤执行完对象处于半初始化状态, 问题在于第2、3步骤,这两个步骤没有很

  15. 7.15 垃圾回收historical

    思想- 垃圾回收算法- 具体的垃圾回收器- jvm参数选用具体的垃圾回收器 1. 核心问题 GC是在什么时候,对什么东西,做了什么事情? 2. GC是在什么时候 当新生代空间(Eden+Fron)满的时候发生MinorGC,当老年代空间不足的时候发生MajorGC(一般也伴随着MinorGC),当S

  16. 7.16 对象在内存中的布局historical

    1. 对象的组成 对象有两种,一个普通对象,另一种数组对象 1.1. 对象头(Object Header) 1. mark word 存储了对象的hashCode、GC信息、锁信息三部分 - 锁信息:不同的状态存储的位的意义不同。跟锁有关的是最后三个bit位,001表示无锁态,00表示轻量级锁,10

  17. 7.17 引用historical

    1. 强软弱虚引用 1.1. 强 最普遍的引用。一个对象具有强引用,那么绝不会被回收。 - 例子 1.2. 软 内存足够的时候不会被回收,不足的时候会被回收。 使用SoftReference实现,一般用于缓存 - 例子 1.3. 弱 不管内存是否充足,一旦发生gc就会被回收 1.4. 虚 监控GC回

  18. 7.18 对象怎么定位historical

    - Oracle JDK和OpenJDK用的都是直接指针,好处是速度块,坏处是垃圾回收如果移动存活对象那么需要修改指针

  19. 7.19 OOM问题举例historical

    1. 为什么会发生OOM 得从GC回收过程说起(参考垃圾回收.md),可以看出GC之回收GCRoot达不到的对象的,GCRoot引用的对象是强引用,是没办法被回收的。 如果jvm内存中都是强引用对象,那么FullGC后jvm内存剩余空间很有可能不足以存放将要创建的新的对象,就会发生OOM 1.1.

  20. 7.20 性能分析工具historical

    1. 自带工具 1.1. jps 用来查看进程信息 1.1.1. 查看本机java进程ID - 命令 - 结果 1.2. jinfo 用来查看设置的JVM信息 1.2.1. 打印运行中的程序的jvm参数 - 命令 - 结果 1.3. jstack 1.3.1. 打印Thread stack信息 -

  21. 7.21 JVM参数调优historical

    1. 调整哪些参数 1. 针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,通常把最大、最小设置为相同的值; 2. 年轻代和年老代将根据默认的比例(1:2)分配堆内存, 可以通过调整二者之间的比率NewRadio来调整二者

  22. 7.22 GC日志分析historical

    1. Parallel GC日志 1.1. 新生代日志 1.2. 老年代日志 2. 工具 2.1. gchisto jewes/gchisto: A garbage collection log visualisation tool\. Originally hosted at https://ja