摘要:
创建线程的三种方式 继承Thread类 class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName() + " " + 阅读全文
摘要:
类的生命周期 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺 阅读全文
摘要:
对象优先在 Eden 分配 堆分为新生代和老年代,新生代用于存放使用后就要被回收的对象(朝生夕死),老年代用于存放生命周期比较长的对象。 创建的大部分对象,都属于生命周期较短的对象,所以会存放在新生代。新生代又细分 Eden、From Survivor、To Survivor,对象会优先在 Eden 阅读全文
摘要:
JVM 的垃圾收集器主要分为两大类:分代收集器和分区收集器,分代收集器的代表是 CMS,分区收集器的代表是 G1 和 ZGC 分代收集器 CMS 以获取最短回收停顿时间为目标,采用“标记-清除”算法,分 4 大步进行垃圾收集,其中初始标记和重新标记会 STW,JDK 1.5 时引入,JDK9 被标记 阅读全文
摘要:
垃圾回收的概念 垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存爆掉。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。 垃圾判断算法 引用计数算法 引用计数算法(Reachability Counting)是通过在 阅读全文
摘要:
Java 源代码文件经过编译器编译后会生成字节码文件,经过加载器加载完毕后会交给执行引擎执行。在执行的过程中,JVM 会划出来一块空间来存储程序执行期间需要用到的数据,这块空间一般被称为运行时数据区 根据 Java 虚拟机规范的规定,运行时数据区可以分为以下几个部分: 程序计数器(Program C 阅读全文
摘要:
加载与存储指令 public int add(int a, int b) { int res = a + b; return res; } 字节码指令 public int add(int, int); descriptor: (II)I flags: (0x0001) ACC_PUBLIC Cod 阅读全文
摘要:
Java 的源码文件经过编译器编译后会生成字节码文件,然后由 JVM 的类加载器进行加载,再交给执行引擎执行。在执行过程中,JVM 会划出一块内存空间来存储程序执行期间所需要用到的数据,这块空间一般被称为运行时数据区。 栈帧(Stack Frame)是运行时数据区中用于支持虚拟机进行方法调用和方法执 阅读全文
摘要:
javap 字节码的基本信息 public class Test { private int age = 10; public int getAge() { return age; } } 在 class 文件的同级目录下输入命令 javap -v -p Test.class 来查看一下输出的内容 阅读全文
摘要:
.java源文件 package test.JVM; public class Test { public static void main(String[] args) { System.out.println("haha"); } } 十六进制查看.class文件 魔数 第一行中有一串特殊的字符 阅读全文