
深入理解JVM
文章平均质量分 67
qq_16899143
这个作者很懒,什么都没留下…
展开
-
深入理解JVM 第八章 虚拟机字节码执行引擎
一个栈帧需要分配多少内存并不会受到程序运行时变量的影响,只取决于源码和虚拟机实现方式 记录问题:书中说局部变量表的复用可能会导致垃圾回收不及时,做实验看一下 static void test1() { { byte[] placeholder = new byte[1024*1024*64]; } System.gc(); } 这一段代码用-verbose:gc -XX:+UseSerialGC -X..原创 2021-03-11 19:59:27 · 97 阅读 · 0 评论 -
深入理解JVM 第七章 虚拟机类加载机制
好久不写,但是这章真的重要 虚拟机规范中对于什么时候加载类并没有一个统一标准,但是初始化是有且只有六种情况才会进行,详见书中263页,下面记录几个问题和重点 ------------------------------------------------------------ 读取或设置一个类型的静态字段时会初始化该类,但不包括被final修饰的在编译器把结果放入常量池的静态字段:这里暗含了一个知识点,只有基础类型和String会在编译器被标注位ConstantValue放入常量池,也就是说其他类型原创 2021-03-09 21:26:30 · 89 阅读 · 0 评论 -
深入理解JVM 第三章垃圾收集器与内存分配策略
引用计数算法:为每个对象添加一个引用计数器,每次被引用就加一,这样做需要额外的处理才能解决循环引用等问题 可达性分析算法:以GC Roots为起使点集,如果某个对象不可达则证明此对象不再被引用 之前一直搞不明白软和弱的区别 软引用:在系统发生内存溢出之前会对软引用进行回收 弱引用:比软引用更弱一点,被弱引用关联的对象只能存活到下次垃圾回收 虚引用:无法使用虚引用得到对象实例,只能在其对象被回收时收到一个系统通知 对象收集:当一个对象被判定GC Roots不可达时会被第一次标记,之后如..原创 2021-03-01 12:32:53 · 109 阅读 · 2 评论 -
深入理解JVM 第二章 内存区域
程序计数器:标记当前执行的字节码行号,控制程序执行顺序。每个线程拥有自己的程序计数器 Java虚拟机栈:每个Java方法执行时都会创建一个栈帧,用于保存局部变量表,操作数栈,动态连接,方法出口等信息。进入方法后需要在栈帧中分配多大的空间是确定的,不会在方法执行时改变。线程私有 本地方法栈:与虚拟机栈类似,执行本地方法时分配 Java堆:所有对象实例几乎都分配在堆中,被所有线程共享 方法区:储存被加载的类型信息,常量,静态变量等,被所有线程共享 运行时常量池:方法区的一部分,用来保存运行时产生的字面原创 2021-03-01 10:34:42 · 81 阅读 · 0 评论