jvm的轻量级爽口讲解--内存管理子系统(俗称垃圾回收)〇壹

前言

昨天半夜啃书时,笔者突发奇想,要开一个新的系列主题,没错,如标题所言,关于jvm虚拟机的爽口简介,众所周知jvm虚拟机的底层知识相当枯燥,就像是发柴的鸡肉,即使嚼烂也难以下咽,究其原因,是看书的时候问题不明确,只能被博客文章,书中大量知识点牵着鼻子走,因此,笔者准备以问题驱动作为主线,我们先明确要问的问题,整理好问题之间的引用链路,然后再集中解答的方式,先给知识裹一层糖色(shai),让问题变得诱人,再去吃的话就没有那么柴了。那么废话不多说,本系列篇章开始(本篇博客所有问题将有蓝色字体标出,并在博客的最后重复给出,想挑战记忆力的小伙伴可以试着去解答)。

首先我们开始讲一些我们所不懂得枯燥的概念,然后就其提出问题,最后重复一遍问题,这是知识点的开端加工

首先我们回归所有问题的本源,我们为什么要学习这些东西,为了得到one piece 成为海贼王,迎娶倾国倾城的女帝?(海贼王梗)

咳咳,扯远了,当然是为了运用所学

众所周之内存管理是jvm中的一大模块,我们要学这个模块就是为了能在适当的时候能对内存回收进行优化,并且在出现某些问题比如用户访问服务器时卡顿,计算任务运行缓慢的时候能及时定位并解决内存中发生的问题.

总结以上两句话,我们学内存管理子系统原理第一是为了内存优化,第二是为了定位并解决内存分配回收时发生的问题

好的,我们为什么要学原理这个问题已经搞懂了,不清楚了,我们可以重新重复一遍上面的绿色字体,再明确一下。

那么第二组个问题就来了:

内存优化,具体怎么优化?笼统的分为几大类?

作为高级开发人员要理解那些基本原理,才能很好的定位和解决问题?

嗯,有点像是在生孩子,模糊的问题,会生出具体的孩子问题,不过没关系,作者最后会给出问题的结构图,读者们可以根据我的问题树,给出相应的答题树,对,我们是敌人了,拉出你的意大利炮好好打一仗吧兄弟。

首先说内存优化分几类,俗话说的好,十万个读者有十万个哈姆雷特,说一下我的分类(读者可以就《深入理解jvm虚拟机》自行构建知识库):

内存优化分两类,一是根据实际情况选择合适的垃圾回收器,二是通过内存监测(故障处理)工具分析内存回收状况并作出优化。

再说我们要理解哪些基本原理,笔者尽其所能,将有关jvm内存需要使用到的基本原理讲全,如果读者追求更深层次的东西,一篇博客的技术点是远远不够的,学无止境。

我们目前需要理解的基本原理有:

  • jvm内存为什么使用可达性分析算法而不是使用引用计数器算法实现内存块的标记
  • 内存为什么要分代,内存分代和要理解标记-清除算法,标记-复制算法,标记-整理这三个回收算法有什么关系
  • 如何理解并行和并发在内存回收中的意思,并行和并发是如何影响停顿(形象的被称为stop the world)和吞吐量的,stop the world 不是dio的替身能力吗?(jojo梗)
  • ↑↑此问题还包括检查点和检查区域的概念
  • 跨代记忆集是什么,分代后,我为什么还要设置跨代记忆集
  • 看完这些附带新概念的问题之后,你是谁,你在哪里,你为什么要学jvm

好吧,我承认,新概念有点多,所以我们只是提前接触一下,混个脸熟,笔者会在后期系列慢慢讲解。

内存优化的分类当中我们发现,原来有垃圾回收器这种东西,那么

目前垃圾回收器一共有几种,他们的优势特色都是什么,而内存监测工具又有那些。

垃圾回收器截止目前有
Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1

七种稳定的已经投入使用一段时间的垃圾收集器,以及新型的
Shenandoha,ZGC以及Epsilon收集器

他们的优势以及特色,可以从
适应单/多核CPU,所基于的回收算法,是否支持并发(吞吐量以及停顿时间),运行内存的占有量,系统无关性等方面作为切入点考虑

而内存分析工具有java自带的命令行工具(基础故障处理工具)

jps 虚拟机进程状况工具
jstat 虚拟机统计信息监视工具
jinfo 虚拟机运行参数配置工具
jmap 内存dump文件生成(内存映射)工具
jhat dump文件(堆转储)解析工具
jstack 运行时栈结构显示以及线程快照生成(堆栈跟踪)工具


有java的监控软件工具(可视化故障处理)


jvisualvm.exe 多合一故障处理工具可查看Cpu占有,各代分区的实时内存占有情况,线程数等等
jconsole.exe Java监视与管控控制台(疑似jvisualvm的插件)
JHSDB 基于服务性代理的调试工具
Java Mission Control 可持续的在线检控工具


基于开发工具的比如


eclipse的MAT


好的,第一篇我们先了解对整个的jvm虚拟机的执行子系统做一个大概的了解,接下来某些细致的问题,笔者会在接下来的文章中进行细分和拆解
下面,今天的问题树状图奉上因为未解答的问题比较多读者可以只当作需要记忆的概念多读几遍(打脸)
![思维导图](>
下期我们从思维导图的最小叶子节点开始按顺序讲起(jvm内存为什么使用可达性分析算法而不是使用引用计数器算…)