很感谢longdick博主的三篇文章.清晰,容易地了解了JAVA内存模型和GC.在此只是自己用自己的话复述一番!
首先是JAVA内存模型。其实就是空间划分问题。WINDOWS硬盘的空间划分,大家都是很熟悉的,我觉得我使用习惯,无非是把一些东邪分门别类的存放罢了,但是总体结构来看,是个平行交错缠绕的概念。而LINUX呢,一颗树的划分!
JAVA是如何来划分的呢?一:分类,依据对象的生命有:Young(年轻代) Tenured(终身代)在加上一个Perm(永久代)CLASS存放区。这个是大体上的分类,需要注意的是,在JAVA里面,它们都有各自的称谓,这个为的是你可以优调它们的大小比例,但是名称不是你说了算!
分类好了,就引出了另一个问题。如何存放对象?这个就是人如其名了,刚NEW的就到YOUNG,等等。静态方面这个是严格的一一对应的了,是NEW就在NEW 区,绝对不会在别的地方!
静态解决了,如何变化呢?JAVA的策略两个:一GC帮忙,二转移!转移那是很简单的,无非是先看看你空间够不够,够就向你转移罢了。但是注意的是:不是像我们一样可以毫无次序和规则的。转移顺序和像谁转移都是规定好了的!
最麻烦的就是大概就是GC。为什么呢?因为GC是个实体,不像转移只是种策略,因此就在空间和时间上增加了复杂性!这个是非常有必要的,对我们的程序性能瓶颈有很大的影响!
从它存在的实体来讲分两类即:分为Minor GC(次要GC)和 Major GC(主要GC)!那么它们怎么和程序共存和协作呢?三种方式:serial collector,parallel collector,concurrent collector 。其间,在运行期,我可以监控。但是最关心的应该是如何调节其影响!
我这只是泛泛而谈,个人的一点理解而已!