23.垃圾回收概述

前言

  • 垃圾收集,很多语言都存在垃圾收集技术,也成为后来高级语言的主流.让开发者不在关系底层的内存申请回收,聚焦业务功能的实现
  • 垃圾回收的三大经验问题
    • 那些内存需要回收? 什么是垃圾? 对应垃圾的标记阶段和标记算法
    • 什么时候回收? 对应垃圾回收算法
    • 如何回收? 对应垃圾的回收算法

什么是垃圾?

  • 垃圾是指在运行程序中没有任何指针指向的对象,该对象就是需要被回收的垃圾
  • 如果不及时堆内存中的垃圾进行清理,那么这些垃圾会一直保留到程序进程结束,被保留的内存空间也无法被其他对象使用,甚至导致内存溢出

为什么需要GC

  • 对于高级语言来说,一个基本认知就是如果不进行垃圾回收,内存迟早就会消耗完
  • 除了释放没用的对象,垃圾回收也应该清除内存里的碎片.碎片整理使得所占用的堆空间移动到堆一段,以便JVM将整理出来的内存分配给新的对象
  • 随着应用程序的业务越来越庞大和复杂 用户量增多,没有GC就不能保证应用程序的正常运行.因为GC会导致STW降低用户体验,所以每次JDK迭代的时候都会堆GC进行优化

早期垃圾回收

  • 在早期C和C++时代,垃圾回收基本是手工进行.开发人员使用new关键字申请内存,使用delete free()函数进行内存释放
  • 该方式灵活控制内存的申请和释放,但会给开发人员带来频繁的申请和释放内存的管理负担.稍有不慎因编码问题使得内存忘记回收就会产生内存泄漏.垃圾对象永远无法被清除,随着系统运行时间增长,垃圾对象所消耗的内存持续上升,直到内存溢出

java垃圾回收优缺点

  • 优点

  • 自动内存管理,无需开发人员手动参与内存分配和回收,降低内存泄漏和内存溢出的风险

  • 没有GC,java也会和C++一样,各种悬垂指针,野指针,泄漏问题

  • 自动内存管理机制,将程序员从繁重的内存管理中释放,更专心业务开发

  • oracle官网关于垃圾回收的介绍 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html

  • 缺点

  • 对于开发者,自动内存管理如何黑匣子,如果过度依赖自动.最严重的就是弱化java开发人员在程序出现内存溢出定位问题和解决问题的能力

  • 因此,了解JVM内存分配和内存回收原理就非常重要.真正了解JVM如何管理内存之后,才能在遇到OOM时候快速定位问题和解决问题

  • 当需要排查内存溢出和内存泄漏问题时,当垃圾手机成为系统更高并发的瓶颈,此时我们就需要对这里自动化技术实施必要的监控和调节

GC主要关注的区域

GC主要关注方法区和堆中的垃圾回收

image-20200712092427246

垃圾收集器可以对新生代回收,也可以对老年代,设置全栈和方法区的回收

  • 其中,java是垃圾收集器的工作重点

从次数上讲:

  • 频繁收集Young区
  • 较少是收集Old区
  • 基本不收集Perm区或者MetaSpace
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值