- 博客(8)
- 收藏
- 关注
原创 《深入理解Java虚拟机(第3版)- 垃圾收集算法》
1,标记-清除算法:分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。 1)缺点: 1))执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低; 2))内存空间的碎片化问题,标记、清除之后会产生大量不连...
2021-07-04 16:25:06 109
原创 《深入理解Java虚拟机(第3版)-分代收集理论》
收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。如果一个区域中大多数对象都是朝生夕灭,难以熬过垃圾收集过程的话,那么把它们集中放在一起,每次回收时只关注如何保留少量存活而不是去标记那些大量将要被回收的对象,就能以较低代价回收到大量的空间。如果剩下的都是难以消亡的对象,那把它们集中放在一块,虚拟机便可以使用较低的频率来回收这个区域,这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用。跨代引用假说:存在互相引用关系的
2021-07-04 15:49:23 89
原创 《深入理解Java虚拟机(第3版)- 对象缓刑》
当一个对象脱离了GC Roots引用链,并不是马上就被回收的。会经历如下阶段:1,该对象脱离GC Roots引用链,进行第一次标记。2,判断该对象是否覆盖finalize()方法,如果没有,则真的就要被回收了。如果该对象覆盖了覆盖finalize()方法,对象将会被放置在一个名为F-Queue的队列之中,并在稍后由一条由虚拟机自动建立的、低调度优先级的Finalizer线程去执行它们的finalize()方法。这里所说的“执行”是指虚拟机会触发这个方法开始运行,但并不承诺一定会等待它运行结束
2021-07-04 15:27:46 71
原创 《深入理解Java虚拟机(第3版)- 垃圾对象判定》
1,引用计数法:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。(Java并没有采用这种方式,要是用这种方式,第一个拖出去的就是Spring bean互相依赖问题) 1)缺点:对象objA和objB都有字段instance,赋值令objA.instance=objB及objB.instance=objA,除此之外,这两个对象再无任何引用,实际上这两个对象已经不可能再被访问,但是它们因为互相引用着...
2021-07-04 15:10:28 168
原创 《深入理解Java虚拟机(第3版)》-对象的访问定位
对象创建出来,肯定是用来被读取或者更改的,那就需要访问定位到这个对象。主流的访问方式有两种:1,句柄访问:Java堆中将可能会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息。这种方式访问需要两次读取,reference -》句柄池-》实例池。2,直接指针:Java堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信息,reference中存储的直接就是对象地址,如果只是访问对象本身的话,就不需要多一次间接访
2021-07-03 15:57:11 59
原创 《深入理解Java虚拟机(第3版)-对象的内存布局》
以下内容基于HotSpot。1,对象头:对象自身定义的数据无关,如何理解与自身定义的数据无关?因为这里存储的数据都合和类定义的数据类型,接口,方法,字段没有一毛钱关系,更多的是为服务于jvm的对于垃圾回收,线程安全执行相关的逻辑。 1)“MarkWord”:对象自身的运行时数据。如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。 2)类型指针:即对象指向它的类型元数据的指针,Java虚拟机通过这个指针来确定该对象是哪个类...
2021-07-03 15:42:19 54
原创 《深入理解Java虚拟机(第3版)-对象创建》
对象的创建,从代码上看,就是new一个对象,或者通过反射调用构造器。其步骤:1,获得这个对象所属的类的信息。很好理解,要创建一个对象,那首先得获得这个对象所属的类对吧,从常量池中找到这个类的引用,看类是否已经被加载过。如果没有,则先解析,加载这个类。 1)为什么从常量池里找?结合JMM的结构,类的信息,版本号,接口,字段,方法等数据,都是放在运行时常量池的。2,为对象分配内存空间,也就是从堆中划分一部分内存空间用于存储这个对象,这个大小在类加载完了之后就可以确定大小。...
2021-07-03 15:22:41 92
原创 《深入理解Java虚拟机(第3版)》- 内存管理
线程共享的数据区:1,方法区:用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫作“非堆”(Non-Heap),目的是与Java堆区分开来。也就是是说,方法区实际上并不是真是存在的,可能是堆的某一块空间。和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,甚至还可以选择不实现垃圾收集。方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。...
2021-07-01 23:33:53 95
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人