1、java运行时区域
运行时数据区主要分为4个部分,就像房间一样。有两个是线程私有区域,可以看成私有居室;还有两个公共区域,可以看成有两个客厅。
java内存就是相当于2室2厅的房子了,两个居室分别是"程序计数器"和"虚拟机栈",两个客厅分别是"方法区"和"堆"。除了两室两厅以外,还
有个直接内存,不属于虚拟机定义的内存,但是也经常被使用到,可以看成外面的走廊。虚拟机内存结构可以看成是两室两厅的房子外加一个走
廊。现在房价这么贵,这个舒适的大房子不知道需要多少钱。
2、关于虚拟机中的引用
强引用:Object obj = new Object(),只要强引用还存在,垃圾回收集器就永远不会回收掉被引用的对象
软引用:在系统将要发生内存溢出异常之前,将会把这些对象列进回收返回之中进行第二次回收
弱引用:被弱引用关联的对象,只能生存到下一次垃圾回收集发生之前
虚引用:........
3、垃圾回收集算法
标记——清除:
这种是最基础的算法,标记跟清除这两种操作效率都很低。而且在清除之后会产生大量的不连续的内存碎片,可能会导致程序在运行时需要
分配大对象时找不到足够大的内存空间,不得不提前触发一次垃圾回收操作。
复制算法:
它将可用内存按容量分为大小相等两块,每次只使用其中一块内存,当这一块内存使用完了,就将还存活的对象复制到另外一块上面,然后
再把自己使用过的内存一次清理掉,这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。
4、内存分配
上面提到复制算法把内存分为1:1的结构,但是实际情况是经过垃圾回收还存活的对象已经很少了。Hotspot虚拟机的内存比例为8:1:1,
存活下来的对象就存放在十分之一的内存里面,如果内存不够的话就往另外一个10分之1的内存借用,如果还不够的话就只能放到老年代了。
新生代(年轻代)主要放新创建的对象,里面内存的分配Eden:Survior:Survior为8:1:1,就是复制算法涉及到的内存比例,如果对
象经过几次扫描仍然存活,jvm则将其移到old Gen老年代。
老年代:存放生命周期比较长的对象和内存大小相对比较大的对象,垃圾回收也没有那么频繁,老年代主要采取压缩的方式来避免内存碎片。
网友评论