JVM
文章平均质量分 58
HeloJ
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
内存溢出、泄漏
1. 内存泄漏 程序无法释放已申请的内存空间 1.1 声明静态的集合类 如:private static Map<String> map = new HashMap(); 它们的生命周期与应用程序的生命周期相同,容易导致OOM。 1.2 ThreadLocal未主动remove ThreadLocal使用弱引用作为key,当ThreadLocal不存在外部强引用时,key会被GC回收,就导致key为null,value还存在强引用,只有在线程结束时,value的强引用才会断掉 1.原创 2021-05-09 16:43:00 · 168 阅读 · 0 评论 -
垃圾收集器
1. Serial收集器 是一个单线程垃圾收集器,垃圾收集过程过程中会STW,新生代使用标记-复制算法,老年代使用标记-整理算法。 启动参数:-XX:+/-UseSerialGC,可应用于客户端模式下虚拟机。 2. ParNew收集器 Serial收集器的多线程版本,能与CMS收集器配合工作。 老年代使用CMS后(-XX:+/-UseConcMarkSweepGC),新生代模式使用ParNew。 启动参数:-XX:+/-UseParNewGC(JDK9取消),默认开启收集线程数...原创 2021-05-09 16:42:12 · 203 阅读 · 0 评论 -
HotSpot算法细节
1. 根节点枚举 类加载完成后,HotSpot使用一组OopMap数据结构来记录对象内对应偏移量上对应的数据类型,在即时编译过程中,也会在特定位置记录下栈里和寄存器里哪些位置是引用。这样,垃圾收集器在进行GC Roots扫描时就不要从方法区等GC Roots开始查找,优化引用链构建效率。 OopMap会带来其他问题:如果每条指令都生成OopMap将需要大量额外的空间,此时引出了安全点。 2. 安全点 安全点主要针对程序获取CPU时间片,执行进行垃圾收集的情况。 HotSpot只在安全点位置才会生成原创 2021-05-09 16:39:04 · 396 阅读 · 0 评论 -
垃圾收集算法
1. 分代收集理论 分代收集理论建立在两个分代假说之上: 弱分代假说:绝大多数对象都是朝生夕灭的。 强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。 2. 标记-清除算法 最基础的垃圾收集算法,分为标记和清除两个阶段 标记出所有需要回收的对象 标记完成后,统一回收掉所有被标记的对象 此算法主要缺点有两个: 执行效率不稳定 如果Java堆中包含大量需回收的对象,标记和清除的执行效率将降低 内存空间碎片化 清除之后产生大量不连续的内存碎片,导致后期分配较大对象时无法找到足够内原创 2021-05-09 16:38:00 · 131 阅读 · 0 评论 -
对象存活判定
1. 引用计数算法 在对象中添加一个引用计数器, 每当有一个地方引用它时,计数器就加一; 当引用失效时,计数器值就减一; 任何时刻计数器为零的对象就是不可能再被使用的。 缺点:无法解决对象之间相互循环引用的问题 2. 可达性分析算法 从GC Roots到对象不可达时,则此对象不可能再被使用 GCRoots对象: 虚拟机栈中引用的对象,如:各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等 方法区中类静态属性引用的对象,如:Java类的引用类型静态变量 方法区中常量引用的对象,原创 2021-05-09 16:35:59 · 172 阅读 · 0 评论 -
对象访问定位
Java程序会通过栈帧中的reference数据来操作堆上的具体对象,主流的对象访问方式有两种: 使用句柄访问 直接指针访问 1. 使用句柄 Java堆中可能会划分处一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄包含了对象实例数据与类型数据各自具体的地址信息。 优点:对象被移动时只会改变句柄中实例数据指针,reference本身无需更改 2. 直接指针 reference中存储对象地址,HotSpot使用此种访问方式 优点:访问速度快,节省一次指针定位的时间原创 2021-05-09 16:34:52 · 150 阅读 · 0 评论 -
对象内存布局
在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三个部分: 对象头 实例数据 对齐填充 1. 对象头 对象头包含一般包含两类信息,数组对象包含三类信息 1.1 存储对象自身的运行时数据(Mark Word) 如:哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向锁ID、偏向时间戳等 1.2 类型指针(Klass) 类型指针指对象指向它的类型元数据的指针,Java虚拟机通过这个指针来确定该对象是哪个类的实例。 1.3 数组长度 仅数组对象包含,主要用来虚拟机通过普通Jav原创 2021-05-09 16:34:12 · 122 阅读 · 0 评论 -
对象创建流程
原创 2021-05-09 16:32:44 · 110 阅读 · 0 评论 -
内存模型
1. 程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。 各条线程之间程序计数器互不影响,独立存储,即:线程私有。 如果执行一个Java方法,程序计数器记录正在执行的虚拟机字节码指令的地址; 如果执行一个Native方法,程序计数器记录为空(Undefined)。 《Java虚拟机规范》未对此内存区域规定任何OOM情况。 2. Java虚拟机栈 Java虚拟机栈是线程私有的,生命周期与线程相同。 虚拟机栈描述的是Java方法执行的线程内存模型:每个..原创 2021-05-09 16:29:19 · 131 阅读 · 0 评论
分享