JVM
ladymorgana
这个作者很懒,什么都没留下…
展开
-
JVM进阶(一)——初识JAVA栈
JVM进阶(一)——初识JAVA栈 若想使自己编写的Java程序高效运行,以及进行正确、高效的异常诊断,JVM是不得不谈的一个话题。 本”JVM进阶“专栏大部分内容均来源于经典书籍《深入理解Java虚拟机》-- 周志明著。 下面言归正传,本文重点从虚拟机内存模型(运行时数据区域)入手。先看图: 这是一张比较官方的虚拟机模型图,今天讲的就是虚线框中栈的部分。 栈是...转载 2018-08-31 15:36:23 · 398 阅读 · 0 评论 -
JVM进阶(二)——初识JAVA堆
JVM进阶(二)——初识JAVA堆 在博文《JVM进阶(一)——初识JAVA栈》中我们说到了栈,他在内存中是连续的空间;保存一个个的栈帧,对应一次次方法的调用;还讲到了他是保存对象的引用,那么对象存在哪里呢?我们来看看昨天的一张图: 对象就存在图中的内存区域,在JVM中,那片区域叫做堆! 由图中可以看到堆的存储结构和栈是不同的,堆在内存中并不是一块连续的区域,他是分散的(...转载 2018-08-31 15:50:33 · 308 阅读 · 0 评论 -
JVM进阶(三)——内存分配与回收策略
JVM进阶(三)——内存分配与回收策略 各位小伙伴大家好,还记得上一博文《JVM进阶(二)——初识JAVA堆》我们讲了什么吗?虚拟机中的堆,他是整个内存模型中占用最大的一部分,而且不是连续的。当有需要分配内存的时候,一般有两个方法分配,指针碰撞和空闲列表。该部分的内存回收是由虚拟机的垃圾收集器GC进行管理的。 刚刚粗略的回忆了上一博文所讲的内容,而这一章我们的重点还在堆上面。...转载 2018-09-03 14:38:08 · 240 阅读 · 0 评论 -
JVM进阶(四)——利用MAT排查堆溢出
JVM进阶(四)——利用MAT排查堆溢出 堆已经讲得差不多啦,这章我们以一个例子来说说如何设置以及当发生堆溢出的时候怎么排查问题。先看一小段代码: 代码中使用了一个无限循环来为list添加对象,如果采用默认的堆大小的话可能要等待好久才能出现堆溢出的错误,因此我们要将其设置小一点: -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryErr...转载 2018-09-03 16:07:18 · 334 阅读 · 0 评论 -
JVM进阶(五)——GC之标记
前言 堆分为年轻代和年老代。永久代是非堆内存,它又叫做方法区(一般的说法),主要存储已被加载的类信息、常量、静态变量。而该区域在java8已被删除,取而代之的是元空间,我会在后面的章节细讲。什么是标记?怎么标记? 第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便GC清理。 至于怎么标记,一般有两种方法:引用计数和可达性分析。 引用计数实现起来比较简单,就是给对...转载 2018-09-03 16:28:04 · 1076 阅读 · 0 评论 -
JVM进阶(六)——鲜为人知的二次标记
JVM进阶(六)——鲜为人知的二次标记 上一章我们讲到了标记,但是不是被标记了就肯定会被回收呢?不知道小伙伴们记不记得Object类有一个finalize()方法,所有类都继承了Object类,因此也默认实现了这个方法。 finalize()方法:在该对象被回收之前,该对象的finalize()方法会被调用。 这里的回收之前指的就是被标记之后,问题就出在这里,有没有一种情况就是原...转载 2018-09-03 16:29:10 · 1346 阅读 · 0 评论 -
JVM进阶(七)——从GC日志分析堆内存
JVM进阶(七)——从GC日志分析堆内存 在前面的文章中,我们只设置了整个堆的内存大小。但是我们知道,堆又分为了新生代,年老代。他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比例大小能改变吗?其实这些都是可控的,以前没有讲到是因为就算讲了也只是讲讲而已,看不到实质性的东西。因此这章我们通过分析GC日志来一步步讲解如何细化设置堆内存。 首先我们来了解几个相关的参...转载 2018-09-03 17:29:59 · 1032 阅读 · 0 评论 -
JVM进阶(八)——Stop The World(停顿类型STW)
JVM进阶(八)——Stop The World(停顿类型STW) 小伙伴还记得上一篇中我们留下的一个问题吗?什么是停顿类型!经过前几章的学习,我们知道垃圾回收首先是要经过标记的。对象被标记后就会根据不同的区域采用不同的收集方法。看上去很完美的一件事情,其实并不然。 大家有没有想过一件事情,当虚拟机完成两次标记后,便确认了可以回收的对象。但是,垃圾回收并不会阻塞我们程序的线程,他是与当...转载 2018-09-03 18:02:14 · 14225 阅读 · 0 评论 -
JVM进阶(九)——JAVA 年轻代收集器
JAVA 年轻代收集器 继续上一篇博文所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程。如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低。 因此我们在必要的时候需要对虚拟机进行调优,调优的主要目标之一就是降低STW的时间,也就是减少Full GC的次数。那么这里我们从调优的角度来分析各个收集器的优势与不足。 首先从作用于年轻代的收集...转载 2018-09-03 18:03:48 · 433 阅读 · 0 评论