![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 82
柒个小矮鱼
这个作者很懒,什么都没留下…
展开
-
经典垃圾收集器
经典垃圾收集器,下图:1.Serial收集器一款单线程工作的收集器,“单线程”意义不仅仅说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调在垃圾收集时必须暂停其他所有工作线程直到它收集结束。即使其作为一款古老的收集器相对其他收集器来说显得有点鸡肋,但与其他垃圾收集器的单线程比就显得简单高效,对于资源受限的环境,它是所有收集器里额外内存消耗最少的;对于核心处理器较少的环境,它没有线程交互开销,可以获得最高的单线程收集效率。Serial收集器依然是HotSpot虚拟机运行在客户端模原创 2021-07-18 00:01:09 · 134 阅读 · 0 评论 -
jvm运行时内存区域
java虚拟机在java程序执行过程中会把内存区域划分成若干个数据区域,有的随虚拟机启动就存在,有的则随线程的启动和结束而建立和销毁。总的说来包含以下几个运行时内存区域:1.程序计数器程序计数器可以看做是当前线程所执行的字节码的行号指示器。字节码指示器的工作就是通过改变计数器的值选取下一条要执行的字节码指令,如分支、循环、跳转、异常处理、线程恢复等。每个线程都有一个独立的程序计数器,各线程之间的计数互不影响,因此该区域也称为“线程私有”内存。2.java虚拟机栈虚拟机栈也是线程私有的,描述的原创 2021-04-22 22:38:01 · 133 阅读 · 0 评论 -
java堆对象分配、布局、访问全过程
1.对象的创建java虚拟机收到一条字节码new指令时,会先检查该指令参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用的类是否已经被加载、解析和初始化,没有则必先执行类加载过程。类加载完成后就是内存分配,内存分配实际上就是从堆中把一块确定大小的内存划分出来。若堆中内存是规整的,一边是已分配内存,一边是未分配内存,中间则放着一个指针作为分界点的指示器,那内存分配就是将指针挪动对象大小相等的距离,该分配方式称为“指针碰撞”。若堆总内存不是规整的,虚拟机则会维护一个列表记录哪些内存是可用的,原创 2021-04-23 23:32:43 · 179 阅读 · 0 评论 -
java对象是否还存活?
1.引用计数算法在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。但是在java领域中并没有选用引用计数算法来管理内存,主要原因是这个看似简单的算法有很多例外情况要考虑,必须要配合大量额外处理才能保证正确的工作,譬如单纯的引用计数就很难解决对象之间的相互循环引用的问题。2.可达性分析算法比较主流的成语语言都采用可达性分析算法,该算法的基本思路是通过一系列的“GC Roots”的根对象作为起始节点集,从节原创 2021-04-26 22:31:24 · 119 阅读 · 0 评论 -
垃圾收集算法
1.分代收集理论①弱分代假说:绝大多数对象都是朝生夕灭的(划分为新生代)。②强分代假说:熬过越多次垃圾收集过程的对象就越难消亡(划分为老年代)。③跨代引用假说:跨代引用相对于同代引用来说相对较少(例:某个新生代存在跨代引用,由于老年代对象难以消亡,新生代对象对象在多次垃圾回收过程中得以存活,继而也晋升到老年代,此时跨代引用也就消除了)。2.标记-清除算法首先需要标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。该算原创 2021-05-08 00:10:24 · 77 阅读 · 0 评论