专栏首页编程坑太多『互联网架构』软件架构-JVM(中)(26)

『互联网架构』软件架构-JVM(中)(26)

GC这块,当java才入门的时候,老师说java不像c++,c语言需要对内存进行管理,java有垃圾回收机制,会自动进行回收,是实际的生产中也没关注过这些,现在回过头好好了解下,发现里面很有回收很多的机制。

GC

GC(Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。

  1. 对新生代的对象的收集称为minor GC;
  2. 对旧生代的对象的收集称为Full GC;
  3. 程序中主动调用System.gc()强制执行的GC为Full GC。

不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:

  1. 强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)
  2. 软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)
  3. 弱引用:在GC时一定会被GC回收
  4. 虚引用:由于虚引用只是用来得知对象是否被GC

垃圾收集算法

  • 标记-清除算法

标记阶段

标记存活对象

清除阶段

统一回收所有未标记的对象

缺点

会产生内存碎片,如果空间内存碎片太多,当程序产生大对象无法在堆中找到连续空间大小存放的时候,会强制发生GC

  • 复制算法

原理

内存一分为二,每次只使用其中一块,当一块内存没有连续空间存储对象的时候,会把存活下来的对象复制到另外一块内存中,然后一次性清除之前的哪块空间

优缺点

  1. 没有内存碎片问题
  2. 代价就是讲内存减少了一半,空间利用率不高
  3. 不适用于存活对象较多的场景,比如老年代
  4. 而实际上我们并不需要按照1:1的比例来划分,因为大部分对象从创建到结束这个生命周期很短
  5. HotSpot虚拟机默认Eden:Survivor=8:1
  • 标记-整理算法

原理

  1. 标记存活对象,然后把存活对象向一端移动
  2. 清理掉存活对象这端以外的所有空间

优缺点

  1. 适合用于存活对象较多的场合,如老年代
  2. 解决了空间碎片和效率问题:将所有的存活对象压缩到内存的一端,然后清理边界外所有的空间
  • 分代收集算法

分代思想

  1. 堆划分为新生代和老年代
  2. 新生代中,能够存活的对象很少,可以使用复制算法
  3. 老年代中,对象存活率高,而且没有额外的空间用来做老年代的担保,可以使用标记清除或者标记整理算法

垃圾收集器-GC

  1. Serial 新生代串行收集器 新(复制算法),老(标记整理)
  2. ParNew 新生代并行收集器
  3. Parallel Scavenge 新生代并行收集器
  4. 目标:尽可能缩GC时用户线程的停顿时间
  5. 在注重吞吐量或CPU资源敏感的场合,可以优先考虑Parallel
  6. Scavenge收集器 + Parallel Old收集器
  7. Serial Old 老年代串行收集器
  8. Parallel Old 老年代并行收集器
  9. CMS 真正意义上的并发收集器(老年代收集器)
  10. 目标:最短的GC停顿时间
  11. G1

Trace跟踪参数

-verbose:gc

打印GC日志信息

-XX:+PrintGCDetails

打印GC日志信息

-Xloggc:d:/gc.log

GC日志目录

-XX:+PrintHeapAtGC

每次一次GC后,都打印堆信息

-XX:+TraceClassLoading

类加载信息

-XX:+PrintClassHistogram

配置了该参数后,在程序执行过程中,按下Ctrl+Break后,就可以打印类的信息

PS:其实说这么多啊,最重要的还是使用打印的方式看看那个发生内存溢出的情况与数据操作有很大的关系,有助于优化程序。

本文分享自微信公众号 - 编程坑太多(idig88)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 『互联网架构』软件架构-netty之http协议应用实践(58)

    1.初始ServerBootstrap 2.通过ChannelInitializer 初始 pipeline 3.基于SimpleChannelInboundH...

    IT故事会
  • JVM内存管理与垃圾回收机

    IT故事会
  • 「小程序JAVA实战」小程序头像图片上传(上)(43)

    PS:基本头像上传已经完毕,主要是springboot和小微信API的使用。对于用户表中的头像更新和交互式弹框,我后来都在源码上做了升级。建议观看源码。

    IT故事会
  • 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 详解 3.1 概述 本文参考的是周志明的 《深入理解Java虚拟机》第三章 ,为了整理思路,简单记录一下,方便后期查阅。 3.2 对...

    搜云库
  • 面试官:给我说说你对Java GC机制的理解?

    使用Java快一年时间了,从最早大学时候对Java的憎恶,到逐渐接受,到工作中体会到了Java开发的各种便捷与福利,这确实是一门不错的开发语言。不仅是 ...

    xcbeyond
  • JVM技术总结之一——JVM调优

    Serial + Serial Old 收集器:两者都是串行收集器;Serial 收集器用于新生代的 Minor GC,单线程的 STW GC;Serial O...

    剑影啸清寒
  • Java虚拟机知识点快速复习手册(上)

    Csdn全复习手册文章导航:https://blog.csdn.net/qqxx6661/article/details/86775594

    后端技术漫谈
  • JVM内存分配策略,及垃圾回收算法

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当...

    李红
  • JS内存泄漏排查方法

    内存泄漏是一个累积的过程,只有页面生命周期略长的时候才算是个问题(所谓“刷新一下满血复活”)。频繁交互能够加快累积过程,偏展示的页面很难把这样的问题暴露出来。最...

    ayqy贾杰
  • Java虚拟机知识点快速复习手册(上)

    https://blog.csdn.net/o_nianchenzi_o/article/details/78629929

    Rude3Knife的公众号

扫码关注云+社区

领取腾讯云代金券