
java
文章平均质量分 91
csa121
这个作者很懒,什么都没留下…
展开
-
jvm学习笔记6--HotSpot的算法细节实现
前面学习了怎么判别要回收的对象,以及垃圾回收的一些方式、标记-清除算法、标记-复制算法、标记-整理算法。现在看看我们每天使用的HotSpot虚拟机中算法的细节实现。 根节点枚举 前面已经学习到可作为GC Roots的一些变量或者属性,但是实际上在查找过程中要做到高效也是很困难的,要逐个检查以这里为起源的引用肯定要消耗不少时间。 而且迄今为止,所有收集器在枚举根节点这步骤的时候都是需要暂停所有的用户线程的,这时就会面临和前面整理内存碎片算法中”Stop The World“同样的问题。 目前主流的jvm使用的原创 2020-07-26 19:00:44 · 291 阅读 · 0 评论 -
jvm学习笔记5--垃圾回收算法
垃圾回收算法可分为2类: * 引用计数式垃圾收集(直接垃圾收集) * 追踪式垃圾收集(间接垃圾收集) java主流的虚拟机都是采用追踪式垃圾收集的方式,我们主要学习这个。 分代收集 弱分代假说:绝大部分对象都是朝生夕灭的 强分代假说:熬过越多次垃圾收集过程的对象就越难消亡 跨代引用假说:相对于同代引用只占极少数 第3条是根据前2条假说逻辑得出的隐含推论:存在相互引用的2个对象,是应该同时生存或者消亡的。举个例子,如果某个新生代对象存在跨代引用,由于老年代难以消亡,该引用会使得新生代对象在回收时同样存活,原创 2020-06-04 00:35:39 · 195 阅读 · 0 评论 -
jvm学习笔记4--堆区和方法区的对象回收判别
复习 前面有提到jvm的内存模型,我们知道,程序计数器、虚拟机栈和本地方法栈是和线程同生共死的,每个栈帧的大小在类结构确定下来之后就都是已知的。因此这几个区域的内存分配和回收都是有确定性的。 然而,java堆和方法区却有着显著的不确定性。只有程序在运行期间,我们才知道具体要创建哪些对象,创建多少对象,分配多少内存。这部分的内存分配和回收都是动态的。所以垃圾回收器所关心的就是这部分内存的管理。 复习完之前的内容,我们就知道了垃圾回收器的关心重点在于堆内存的对象管理和方法区管理。 在垃圾回收器回收内存之前,要做原创 2020-06-03 00:59:17 · 204 阅读 · 0 评论 -
jvm学习笔记3--对象的内存布局
今天是520,不管有没有对象,都要学习呀 在我们经常使用的HotSpot虚拟机中,对象在堆内存中的布局可以分为3个部分: 对象头 实例数据 对齐填充 对象头 对象的对象头包含2类信息: 用于存储对象自身的运行时数据 如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程的id、偏向时间戳等。这些数据的长度在32位和64位虚拟机中,分别占用32bit和64bit,官方称之为"Mark Word" mark word如图所示: 类型指针 即对象指向它的类型元数据的指针,jvm通过这个指针确认该对象是哪原创 2020-05-20 23:51:04 · 224 阅读 · 0 评论 -
jvm学习笔记2--对象的产生
提出问题 在java的世界中,我们频繁的会使用对象。创建一个对象对我们而言,就是一行代码: User user = new User("hello world"); 在这行代码的背后,jvm都做了哪些工作呢?学习总结下。 对象创建过程 当jvm在执行字节码指令的时候,遇到一条字节码new指令的时候,做以如图所示的以下工作: 检查常量池 先去检查下这个指定的参数在常量池中是否可以定位到一个类的符号引用,并且要去检查这个符号引用所代表的类是否已经被加载、解析和初始化过。有的话,就直接引用;没有的话就要执行原创 2020-05-15 00:23:50 · 149 阅读 · 0 评论 -
jvm学习笔记1--内存模型
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。如下图所示: ...原创 2020-05-13 23:46:54 · 229 阅读 · 0 评论