Java进阶-内存分配与回收策略

255 阅读2分钟

GC: 1.谁需要GC(垃圾回收)?
凡是共享的对象需要GC,如栈不需要,线程结束栈就结束了。 堆需要而且是回收的重点,方法区/元空间也需要回收。

VM参数设置
-Xms 堆区内存初始内存分配的大小
-Xmx 堆内存可被分配的最大上限
-XX:+PrintGCDetails 打印gc详情
-XX:+HeapDumpOnOutOfMemoryError 当堆内存空间溢出时输出堆的内存快照

堆的划分:
新生代(Eden空间、From Surivor空间、To Surivor空间)、老生代(ParOldGen)
堆中参数配置:
新生代大小: -Xmn20m 表示新生代大小20m(初始和最大)

-XX:SurvivorRatio=8 表示Eden和Survivor(2)的比值,
缺省为8 表示 Eden:From:To= 8:1:1
2 Eden:From:To= 2:1:1

GC如何判断对象的存活
引用计数法(jvm早期使用)
A==>B (+1)
C==>B (1+1=2)
缺点:相互引用
A==>B同时B==>A 很难判断是否该回收
可达性分析(主要使用)

各种引用; 软引用softReference:(即将发生GC的时候,比如显示大图内存不够的时候,就会自动进行垃圾回收)
弱引用WeakReference():(只要出现垃圾回收就会进行回收,不需要等到即将发生GC的时候)(如weakHasmap、ThreadlocalMap中也有)
虚引用PhantomReference(): 使用的比较少

如何进行GC的(有哪些垃圾回收算法)?
1.复制算法
特点 实现简单、运行高效 内存复制 没有碎片、利用率只有一半

2.标记清除算法
特点:利用率100% 不需要内存复制 有内存碎片

3.标记整理算法
特点:利用率100% 没有内存碎片 需要内存复制(所以效率不如清除算法)