
JVM
文章平均质量分 83
Java_Poison
这个作者很懒,什么都没留下…
展开
-
玩转JVM中的对象及引用④:对象的分配策略及优化技术
一、基本垃圾回收算法 ①按照基本回收策略分 (1)引用计数(Reference Counting) 比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一 个计数。垃圾回收时,只用收集计数为 0 的对象。此算法最致命的是无法处理循环引用的 问题。 (2)可达性分析清理 标记-清除(Mark-Sweep):此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时, 会产生内存碎片 复制(Copying)原创 2021-04-16 09:41:20 · 211 阅读 · 0 评论 -
玩转JVM中的对象及引用②:对象的内存布局及访问
一、对象的内存布局 问:在 Java 对象创建后,到底是如何被存储在Java内存里的呢? 答:在Java虚拟机(HotSpot)中,对象在 Java 内存中的 存储布局 可分为三块: 对象头 存储区域 实例数据 存储区域 对齐填充 存储区域 ①对象头 区域 此处存储的信息包括两部分: 对象自身的运行时数据(Mark Word) 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等 该部分数据被设计成1个 非固定的数据结构 以便在极小的空间存储尽量多的信息原创 2021-04-14 09:33:32 · 338 阅读 · 2 评论 -
玩转JVM中的对象及引用①:虚拟机中对象的创建过程
一、类加载检查 当Java虚拟机遇到一条new指令的时候,它会先去运行时常量池中寻找new的类的符号引用,并且检查这个符号引用所代表的类是否已经被加载、解析、初始化过。如果没有即需要进行相应的类加载过程。 二、为新生对象分配Java堆内存 对象所需要的内存大小在Java类加载的时候已经确定下来了。为对象分配堆内存相当于把一块内存分出来放置对象。 主要分配内存的方式有两种:指针碰撞和空闲列表。 指针碰撞:如果堆内存空间是规整的,那么,只需要将指针向空闲区域移动对象大小的内存即可以实现分配内存。 空闲列表:原创 2021-04-13 13:53:34 · 190 阅读 · 1 评论 -
玩转JVM中的对象及引用③:对象的存活以及各种引用
对象生死判断算法 垃圾回收的第一步就是判断对象是否存活,只有“死去”的对象,才会被垃圾回收器所收回。 ①引用计数器算法 引用计算器判断对象是否存活的算法是这样的:给每一个对象设置一个引用计数器,每当有一个地方引用这个对象的时候,计数器就加1,与之相反,每当引用失效的时候就减1。 优点: 实现简单、性能高。 缺点: 增减处理频繁消耗cpu计算、计数器占用很多位浪费空间、最重要的缺点是无法解决循环引用的问题。 因为引用计数器算法很难解决循环引用的问题,所以主流的Java虚拟机都没有使用引用计数器算法来管理内存。原创 2021-04-15 09:53:04 · 213 阅读 · 2 评论