1. 7.8 类初始化顺序historical

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

  2. 7.9 对象分配规则historical

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

  3. 7.10 3.垃圾回收器historical

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

  4. 7.11 自定义类加载器historical

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

  5. 7.12 逃逸分析historical

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

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

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

  7. 7.14 对象的创建过程historical

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

  8. 7.15 垃圾回收historical

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

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

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

  10. 7.17 引用historical

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