最近学习jvm,一点理解,希望和大家一起分享,不对的地方,大家共同讨论。
写在前面的话,很重要。jvm不仅仅是垃圾回收,还有很多别的事,如类加载、对接操作系统等。这里我们说jvm的垃圾回收。
为什么要垃圾回收?因为我们每台物理机的内存是有限固定的,我们的应用程序只要在运行就会不断生成新的对象。这时候如果需要保证服务器能继续工作,就必须去进行对象的回收。JVM这里帮我们进行了回收,回收垃圾的时候要关注什么?这里其实可以看做一个业务需求:
- 回收的正确性。要保证回收掉的是正在已经不使用的对象。
- 回收的高效性。让我们的程序能更好的使用服务器的内存。能够支撑我们高并发、请求量比较高的服务
拿到这个需求后,我们开始开发:
- 如何保证正确性:可达性分析算法
- 如果高效回收:分代回收->各种算法(标记整理、复制清除等等)
这里发现,在使用这些做垃圾回收的时候,都需要在某个回收过程中,停止用户进程产生新的垃圾对象,由于垃圾回收无法避免停止用户线程(stop the world),但是我们可不可以做到时间更短呢,如果时间短到毫秒级,是不是可以做到用户无感知。
首先谈下算法,每种算法的优势,它适合处理什么样内存使用模型:
这里我认为,这里跟我们的业务有很大关系,我们的业务是不是会瞬间产生很多对象,我们的对象是对大对象还是小对象,我们业务对象存活的时间。这里会决定我们使用什么样的垃圾算法,继而影响我们选择不同的垃圾收集器(不同的垃圾收集器的算法不同,特点不同),这里也是我们jvm调优考虑的重点,我们相关的参数如何配置,当然这需要我们通过不断的参数配置,找到适合我们当前业务系统的更好的配置参数大小。
可达性分析算法:
复制-清除算法:
标记-整理算法
复制清除算法:
分代回收
这里对内存做了逻辑上的分片。为什么这样处理?
//TODO
分代模型