网站建设 赣icp 南昌,域名服务器如何申请,电子商务网站建设与维护方法分析不包括,软件应用商店appGC垃圾回收
如何判断对象可以回收 引用计数法 如果有对象引用计数加一#xff0c;没有对象引用#xff0c;计数减一#xff0c;如果计数为零#xff0c;则回收 但是如果存在循环引用#xff0c;即A对象引用B对象#xff0c;B对象引用A对象#xff0c;会造成内存泄漏 可…GC垃圾回收
如何判断对象可以回收 引用计数法 如果有对象引用计数加一没有对象引用计数减一如果计数为零则回收 但是如果存在循环引用即A对象引用B对象B对象引用A对象会造成内存泄漏 可达性分析算法 java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象 扫描堆中的对象看是否能够沿着GC Root对象为起点的引用链找到该对象找不到表示可以回收 哪些对象可以作为GG Root System Class 例如ObjectStringHashMap等 Native Stack Thread Busy Monitor 四种引用 强引用new的对象赋值的对象 Object obj new Object()//new 的对象都是是强引用只要强引用存在垃圾回收器将永远不会回收被引用的对象哪怕内存不足时JVM也会直接抛出OutOfMemoryError不会去回收。如果想中断强引用与对象之间的联系可以显示的将强引用赋值为null这样一来JVM就可以适时的回收对象了 软引用 Object obj new Object()
SoftReference sr new SoftReference(obj);//obj就是软引用在内存足够的时候软引用对象不会被回收只有在内存不足时系统则会回收软引用对象如果回收了软引用对象之后仍然没有足够的内存才会抛出内存溢出异常。这种特性常常被用来实现缓存技术比如网页缓存图片缓存等。 弱引用 Object obj new Object()
WeakReference wr newWeakReference(obj);//obj就是软引用弱引用的引用强度比软引用要更弱一些无论内存是否足够只要 JVM 开始进行垃圾回收那些被弱引用关联的对象都会被回收。在 JDK1.2 之后用 java.lang.ref.WeakReference 来表示弱引用。 虚引用 Object obj new Object()
PhantomReference pr new PhantomReference (obj);//obj就是软引用虚引用是最弱的一种引用关系如果一个对象仅持有虚引用那么它就和没有任何引用一样它随时可能会被回收在 JDK1.2 之后用 PhantomReference 类来表示通过查看这个类的源码发现它只有一个构造函数和一个 get() 方法而且它的 get() 方法仅仅是返回一个null也就是说将永远无法通过虚引用来获取对象虚引用必须要和 ReferenceQueue 引用队列一起使用。 终结器引用 无需手动编码但其内部配合引用队列使用在垃圾回收时终结器引用入队(被引用对象暂时没有被回收)再由Finalizer线程通过终结引用找到被引用对象并调用它的finalize方法第二次GC时才能回收被引用的对象
垃圾回收算法 标记清除 标记标记的过程其实就是遍历所有的GC Roots然后将所有GC Roots可达的对象标记为存活的对象。 清除清除的过程将遍历堆中所有的对象将没有标记的对象全部清除掉。 优点速度快缺点容易产生内存碎片 标记整理 标记标记-整理算法从根对象开始遍历整个对象图标记所有与根对象可达的对象即被引用的对象。 整理标记-整理算法会对内存空间进行整理将所有存活的对象移动到一端而未标记的对象则被认为是垃圾对象。 优点没有产生碎片缺点速度慢 复制 将活着的内存空间分为两块每次只使用一块在垃圾回收时将正在使用的内存块中的存活的对象复制到未被使用的内存块之后清除正在使用的内存块中的所有对象交换两块内存空间完成垃圾回收 优点没有标记清除过程运行高效不会出现“碎片”问题缺点需要两倍的内存空间
分代垃圾回收 老年代存放长时间使用的对象
新生代存放用完就可以丢弃的对象 MinorGC 每次产生的新的对象在伊甸园区如果进行了垃圾回收那么会进行遍历所有对象释放所有的的未被使用的对象将使用的对象通过复制的方式复制到幸存区S1并进行年龄1操作表示该对象每次回收都没有被回收当该值超过一个阈值时就会将该对象放入老年代区表示该对象可能会被长时间使用 minor gc 会引发stop the world进行垃圾回收时会暂停其他的用户线程等垃圾回收后用户线程才恢复运行当对象寿命超过阈值时会晋升到老年区最大寿命是15(4bit) FullGC 老年代空间都不足时先触发Minorgc如果之后内存空间仍然不足则会触发FullGC来对内存空间进行清理STW(stop the world)的时间更长
相关VM的参数 大对象如果说某个对象的大小超过了新生代内存大小那么会将这个对象直接晋升到老年代内存块不会发生GC回收
垃圾回收器 串行 单线程的垃圾回收器 适用于堆内存较小的场景个人电脑 打开串行垃圾回收器
-XX:UseSerialGCSerial(新生代复制算法) SerialOld(老年代标记整理算法)吞吐量优先(1.8默认的垃圾回收器) 多线程的垃圾回收器 适用于堆内存较大的场景需要多核CPU的支持 让单位时间内STW的时间最短 在进行垃圾回收时会占满CPU -XX:parallelGCThreadsn //指定线程数量
-XX:UseAdaptiveSizePolicy //采用自适应的大小调整策略调整新生代的大小
-XX:UseParallelGC //开启吞吐量优先垃圾回收器
//ratio默认为99此时值为0.01只能由1%的时间用来进行垃圾回收(100min,只能有1min进行垃圾回收)
-XX:GCTimeRatioratio //(公式1/1ratio)响应时间优先(基于标记清除算法) 多线程的垃圾回收器 适用于堆内存较大的场景需要多核CPU的支持 尽可能的让单次STW的时间最短 -XX:UseConcMarkSweepGCG1(JDK9之后的默认的垃圾回收器)
定义Garbage First
适用场景
同时注重吞吐量和低延时默认的暂时目标是200ms超大堆内存会将堆划分为多个大小相等的Region整体上是标记整理算法两个区域之间是复制算法
相关参数
-XX:UseG1GC
-XX:G1HeapRegionSizesize //设置Region的大小(1,2,4,8,16)
-XX:MaxGCPauseMillistime //暂停目标时间G1垃圾回收阶段 3.1Young Collection(新生代) 会STW 会将幸存的对象复制到幸存区之后新生代内存满了会将部分常用的对象复制到老年代内存 3.2Young CollectionConcurrent Mark(新生代并发标记) 在YoungGC时会进行GC Root的初始标记 老年代占用堆空间比例达到阈值时(默认为45%)进行并发标记(不会STW) 3.3Mixed Collection(混合收集) 会对伊甸园新生区老年区进行全面垃圾回收 最终标记会STW 拷贝存活会STW Young Collection 跨代引用 新生代回收的跨代引用(老年代引用新生代)问题
垃圾回收调优
调优领域 内存锁竞争cpu占用io 最快的GC是不发生GC 查看FullGC前后内存占用考虑几个问题 是不是数据太多了数据表示是否太臃肿是否存在内存泄漏 新生代调优 所有new操作的内存分配非常廉价死亡对象的回收代价为零大部分对象用过即死minorgc时间远远低于fullgc所以新生代内存块的大小应该设置为堆大小的1/4~1/2最佳过大的话会导致老年代内存过小发生频繁 FullGC幸存区要足够大到能保留当前活跃对象和需要晋升的对象晋升阈值配置要得当让长时间存活对象能尽快晋升 老年代调优(CMS) CMS的老年代内存越大越好将老年代内存预设调至1/4~1/3