JVM垃圾收集与内存分配策略

虽然比较详尽的分析了JVM各个垃圾收集算法的执行过程,以及对于各个垃圾收集器的介绍,但似乎条理并不那么清晰。“只看这一篇”的梗实在炒烂了,但事实上这篇文章还是希望在之前对于Java GC的了解上,更加系统的整理一下,旨在梳理出清晰系统的知识网络。

不算图文并茂,但字字珠玑。还是想说一句,关于Java GC,在我的site上面,只看这一篇文章就够了!

Read More

Java ClassLoader详解

源自朋友踩的一个坑:这位仁兄将一个工具类的静态方法加上synchronized关键字后,预期在各个线程之间做同步,预期是在获得类锁后访问该静态方法的各个线程互斥。暂且不谈效率问题,他告诉我这样synchronized之后同步失败了,显然是不科学的。在讨论一番之后,发现他是在两个service中分别启动了一个线程,这两个线程想要互斥的访问加载上来的工具类的静态方法。。。

Read More

JVM调优(四) - 分代GC详解

为什么要分代

分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。

在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至只用一次即可回收。

Read More

JVM调优(三) - GC面临的问题

如何区分垃圾

上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。

所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的。

上面分析的堆和栈的区别,其中栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个线程对应的,因此,如果有多个线程的话,则必须对这些线程对应的所有的栈进行检查。

Read More