在Java中支持GC的概念,GC有两种调用形式:自动调用、手工调用:

(Runtime.getRuntime().gc())

在写代码的时候,很少手工调用,因为不是实时的。那为什么不是实时的?因为GC不是把没用的空间腾出来就完毕了。比如说,有十处垃圾点,直观感受回收就是把垃圾挪出去就行,其实不是。因为一旦要进行GC,至少应该先找到垃圾,而后再把垃圾的空间填新东西。

自动调用

JVM什么时候会自动调用呢?回答这个问题,就牵扯到了两类的GC操作环境。先看下图

Eden:伊甸园 Survivor:存活区 Tenured:老年区

  1. 当程序之中需要产生新的实例化对象(关键字new、对象克隆、反射实例化)的时候,因为一定要进行内存空间的开辟,所以此时需要申请新的内存空间
  2. 新对象要申请的对象的空间默认都在伊甸园区(新生)进行开辟,因此需要判断伊甸园区是否有空余的内存空间。
  3. 如果有空余的内存空间,则直接在伊甸园区开辟新的堆内存空间,此时不会发生有GC处理;
  4. 如果新对象无法在伊甸园空间申请出新的空间,那么就表示现在的伊甸园的空间不足,不足就需要将那些无用的新对象进行回收(此时叫Minor GC)
  5. 当回收完毕后还要判断该空间是否有空余的空间可以容纳新的对象,如果可以容纳,则开辟新空间,保存新对象
  6. 如果此时伊甸园区即时执行了Minor GC后发现依然没有可以被回收的对象,那么这时候就会判断存活区是否有空间(存活区一般与伊甸园的比率是 1:1:8)
  7. 如果存活区有空余空间,则将那些活跃的伊甸园区的部分对象直接保存给存活区,这样就相当于伊甸园区可以腾出部分的空间(这个空间非常的小)来,供新对象进行使用
  8. 如果此时存活区依然满了(空间不足),则继续向老年代进行内存空间的申请。向老年代进行空间的申请,首先会判断老年代的空间是否空余
  9. 如果空余则将存活区中的活跃对象保存在老年代,而后存活区得到了空间释放,伊甸园区得到了空间释放,则对象空间申请成功
  10. 如果老年代也是满的,那么这个时候会执行FULL GC(又叫完全GC、major GC)进行老年代的内存释放
  11. 如果释放成功,则进行对象的保存,如果释放不成功则表示已经没有无用的内存空间了,那么就会抛出OOM(OutOfMemoryError)

这就是对象的创建以及垃圾回收流程,也是GC自动操作的触发条件

关于上面流程还有一个面试题:自动的GC什么时候触发?
GC的触发有两类:

  • Minor GC:发生在年轻代内存空间,当年轻代内存空间不足时会进行触发,释放年轻代中不活跃的对象
  • Full GC(Major GC):发生在老年代的内存空间,当老年代的内存空间不足时会自动触发Full GC,如果触发Full GC之后,内存空间依然不足,则会产生OutOfMemoryError的错误信息

四、对象创建和垃圾回收流程相关推荐

  1. JVM垃圾回收系列--内存模型/垃圾回收流程

    原文网址:JVM垃圾回收系列--内存模型/垃圾回收流程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java各个代的关系(内存模型)及垃圾收集流程. 内存模型 JDK8的内存模型 在Java中所有 ...

  2. python 对象销毁_python对象销毁实例(垃圾回收)

    python对象销毁实例(垃圾回收) 我就废话不多说了,直接上代码吧! '''python对象销毁(垃圾回收)''' class Point: 'info class' def __init__(se ...

  3. 判断是否存在此对象_JVM的垃圾回收机制,判断对象是否死亡

    这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制 ...

  4. JVM虚拟机(四):JVM 垃圾回收机制概念及其算法

    垃圾回收概念和其算法 谈到垃圾回收(Garbage Collection)GC,需要先澄清什么是垃圾,类比日常生活中的垃圾,我们会把他们丢入垃圾箱,然后倒掉.GC中的垃圾,特指存于内存中.不会再被使用 ...

  5. Java 中的四种引用及垃圾回收策略

    Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...

  6. python 类定义 垃圾_什么是python对象摧毁?python中的对象摧毁(垃圾回收)机制是什么?...

    在这篇文章之中我们来了解一下python对象摧毁(垃圾回收),对于刚刚接触到python这一编程语言的朋友来说,对于python对象摧毁(垃圾回收)的了解应该比较少,并且不清楚关于python垃圾回收 ...

  7. java gc 对象可达性_JVM垃圾回收系列---GC Roots可达性分析

    JVM的垃圾回收对于Java开发人员来说是比较透明的,本文采用问答的形式进行展开,希望能够解释下垃圾回收的一些问题.那么首先第一个问题 问:什么样的对象会被回收. 答:已经死亡的对象,不可达的对象,肯 ...

  8. 计算机垃圾回收的过程,谈谈.net对象生命周期(垃圾回收)

    不用程序员操心的堆 -托管堆 程序在计算机上跑着,就难免会占用内存资源来存储在程序运行过程中的数据,我们按照内存资源的存取方式将内存划分为堆内存和栈内存. 栈内存,通常使用的场景是:对存取速度要求较高 ...

  9. JVM学习笔记之四 四种引用和垃圾回收的两次标记

    四种引用和两次标记 四种引用 java中的数据类型我们知道是分为基本数据类型和引用类型的.基本数据类型是8种,分别是boolean byte short int long double float c ...

  10. 深入理解JVM(四)JVM的垃圾回收机制

    文章目录 1 什么是垃圾回收机制 2 Java中的引用类型 3 如何判断对象是否可以被回收 4 方法区的垃圾收集 5 垃圾收集算法 5.1 标记-清除(Mark-Sweep)算法 5.2 标记整理(M ...

最新文章

  1. [转载]Array.prototype.slice.call(arguments,1)原理
  2. 笔记JavaScript基本概念
  3. 源码编译安装 swoole
  4. Java synchronized 中的 while 和 notifyAll
  5. 【摄影测量原理】第二章:单幅影像解析基础
  6. 【直观理解】一文搞懂RNN(循环神经网络)基础篇
  7. URAL 1013 K-based Numbers. Version 3
  8. [vue] 你有自己用vue写过UI组件库吗?
  9. 用windows系统访问ubuntu系统中的文件
  10. WindowsXP、Windows2003本地密码清除方法
  11. 曾经使用过的chart控件(mschart,XCL-Chart,vue-echart)
  12. 使用Java中面向对象的思想来实现两个人的一场战斗
  13. 基于JDK1.8的JVM 内存结构【JVM篇三】
  14. name域名转出的步骤流程有哪些?
  15. B站视频搬运项目,宅男必选!
  16. Nodejs+MongoDB+WebRTC搭建视频通话协同应用
  17. MyBatis入门系列(9) -MyBatis之SQL语句构建器
  18. tushare实盘交易接口
  19. 入手评测 联想小新PRO14,华硕灵耀14s和联想YOGA14s选哪个
  20. 麒麟合盛(APUS)李涛:APUS云重新定义“云联邦”

热门文章

  1. SQL*Plus和iSQL*Plus的区别(oracle)
  2. matplotlib 设置标注方向,更改matplotlib中绘图的轴,标记和标签的颜色
  3. SpringMVC中的九大组件
  4. RabbitMQ消费者流量控制策略总结
  5. jdk优先级队列是如何实现的
  6. mysql中的like查询能否用的到索引
  7. ObReferenceObjectByName vs IoGetDeviceObjectPointer
  8. Java Bean Copy 性能大比拼
  9. 双十二大前端工程师读书清单
  10. Angular 4.x Template-Driven Forms