![](https://img-blog.csdnimg.cn/2019092715111047.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
jvm
jvm
dancheng_work
在时间允许的情况下,源码是最好的开发文档。
展开
-
jvm原理一:HotSpot虚拟机如何为新生对象分配内存
(1)指针碰撞 假如java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”。(2)空闲列表 如果java堆中的内存并不是规整的,已使用的内存和空闲内存相互交错,那就没有办法简单的进行指针碰撞了,虚拟机就必须维护一个列表,记录上那些内存...原创 2018-04-17 22:33:23 · 265 阅读 · 0 评论 -
jvm原理二:对象创建在虚拟机中是非常平凡的行为,在并发情况下,若两个对象同时申请同一地址,如何解决
解决方法:(1)对分配内存空间的动作进行同步处理——实际上虚拟机采用CAS配上失败重试的方式保证更新操作的原子性。(2)把内存分配的动作按照线程划分在不同的空间之中执行,即每个线程在java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)。哪个线程要分配内存,就在哪个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时,...原创 2018-04-17 22:49:38 · 294 阅读 · 0 评论 -
jvm原理三:判断对象是否存活算法
1.计数算法 给对象中添加一个应用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能在被使用的。在主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题引用计数器缺陷的例子: objA = objBobjB = objA互相引用,引用计数器不为0,回收不了。2.可达性算法通过一系列...原创 2018-07-10 13:40:35 · 135 阅读 · 0 评论 -
jvm原理四:利用可达性分析算法GC怎么判断对象生存还是死亡,经过了几次过滤,每次都做了什么
经历了2次标记过程,即2次过滤过程。第一次:如果对象在进行可达性分析后发现没有GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法,当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为没有必要执行。如果这个对象被判定为有必要执行finalize()方法,那么这个对象...原创 2018-07-10 13:41:35 · 618 阅读 · 0 评论 -
jvm原理五:垃圾收集算法
1.标记-清除算法算法:分为“标记”和“清除”两个阶段。首先标记出所有需要回收的对象,在标记完成后统一回收所有标记的对象缺点:一是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作。 2.复制算法算法:它将可用内存按容量划分为大小...原创 2018-07-10 13:42:34 · 112 阅读 · 0 评论