我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java垃圾回收机制怎么理解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java垃圾回收机制怎么理解

这篇文章主要讲解了“Java垃圾回收机制怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java垃圾回收机制怎么理解”吧!

Java垃圾回收是一个自动运行的管理程序运行时使用的内存的进程。通过GC的自动执行JVM将程序员从申请和释放内存的繁重操作中解放出来。

Java垃圾回收GC初始化

作为一个自动执行的进程,程序员不需要在代码中主动初始化GC。Java提供了System.gc()和Runtime.gc()这两个hook来请求JVM调用GC进程。

尽管要求系统机制给程序员提供调用GC的机会,但是实际上这是由JVM负责决定的。JVM可以选择拒绝启动GC的请求,因此并不保证这些请求会真的调用垃圾回收。这是JVM基于内存堆空间的Eden区的使用情况做出的决定。JVM规范将这个选择权利留给了各个JVM的具体实现,因此实际上JVM是如何选择的视不同JVM的实现而定(不过要记住的是,不能依赖于这两个方法的调用,它们是不被保证执行的)。

毫无疑问的是,我们知道垃圾回收进程是不能强制执行的。不过我刚发现一个调用System.gc()确实有意义的场景。看下这篇文章你就会了解System.gc()调用是可用的这个特殊的场景。

Java 垃圾回收进程

垃圾回收是一个回收不再使用的内存空间并将它变成能够为将来的实例使用的过程。

Eden Space:当一个实例被创建的时候,它最初被存放在堆内存空间的年轻代的Eden区中。

注意:如果您不太理解这些术语,建议您先看下介绍内存模型、JVM架构及这些术语的详细解释的文章:garbage-collection-introduction-tutorial

Survivor Space(S0  和S1):作为minor回收周期的一部分,还活着的对象(还有引用指向它)被从eden区中移动到survivor空间S0。同样的,垃圾回收器扫描S0并将活着的实例移动到S1。

无用的对象(没有引用指向)被标记并回收。垃圾回收器(有四种可用的垃圾回收器,将在下一篇文章中介绍)决定这些被标记的实例是在扫描的过程中移出内存还是在另外独立的迁移进程中执行。

Old Generation:老年代或者***代是堆内存的第二个逻辑部分。当垃圾回收器在做minor GC周期中,S1  survivor区中还活着的实例会被提升到老年代中。S1区中不再被引用的对象被标记并清除。

Major GC:在Java垃圾回收过程中实例生命周期的***一个阶段。Major GC在垃圾回收过程中扫描属于Old  Generation部分的堆内存。如果实例没有被任何引用关联,它们将被标记、清除;如果它们还被引用关联着,则将继续存留在old generation。

Memory

Fragmentation:一旦实例从堆内存中删除了,它们原来的位置将空出来给以后分配实例使用。显然这些空闲空间很容易在内存空间中产生碎片。为了能够更快地分配实例地址,需要对内存做去碎片化操作。根据不同垃圾回收器的策略,被回收的内存将在回收的过程同时或者在GC另外独立的过程中压缩整合。

垃圾回收过程中的对象销毁–Finalization

就在移除一个对象并回收它的内存空间之前,Java垃圾回收器将会调用各个实例的finalize()方法,这样实例对象就有机会可以释放掉它占用的资源。尽管finalize()方法是保证在回收内存空间之前执行的,但是对具体的执行时间和执行顺序是没有任何保证的。多个实例之间的finalize()执行顺序是不能提前预知的,甚至有可能它们是并行执行的。程序不应该预先假设实例执行finalize()的方法,也不应该使用finalize()方法来回收资源。

  1. 在finalize过程中抛出的任何异常都默认被忽略掉了,同时对象的销毁过程被取消

  2. JVM规范并没有讨论关于弱引用的垃圾回收,这是明确声明的。具体的细节留给实现者决定。

  3. 垃圾回收是由守护进程执行的

对象何时变成可被垃圾回收的?

  • 所有不能被活着的线程到达实例

  • 不能被其他对象到达的循环引用对象 Java中有多种不同的引用类型。实例的可回收性取决于它的引用类型。

Java垃圾回收机制怎么理解

在编译过程中Java编译器有个优化机制,编译器可以选择将null赋值给一个实例,这样就将这个实例标志为可被回收的。

class Animal {        public static void main(String[] args) {            Animal lion = new Animal();            System.out.println("Main is completed.");        }         protected void finalize() {            System.out.println("Rest in Peace!");        }    }

在上面这个类中,实例lion在除了初始化那一行在其他地方都没有被使用到。因此作为一种优化方法,Java编译器可以在初始化那一行后面立即赋值lion =  null。这样finlizer可能会在Main方法的SOP之前打印结果。

Rest in Peace!  Main is completed.

但结果的顺序是不确定的,它取决于JVM的实现以及运行时的内存使用情况。从中我们能知道的一点是:编译器在发现一个实例的之后的程序中不再被引用时可以选择提前释放实例内存。

  • 这里有个实例何时变成可回收更好的例子。实例所有的属性可以被存储在寄存器中之后可以从寄存器中读取这些属性值,且未来在任何情况下都不会将值写回到实例对象中。这样尽管这个实例在未来还是被使用到了,但是实例对象依然可以被标记为可回收的。

  • 何时能被垃圾回收可以简单到仅仅认为在赋值为null的时候也可以复杂到如上面那一点所说的那样。JVM的实现者会做一些取舍。其目标都是希望留下最少的痕迹,提高响应时间增大吞吐量。为了能够达到这些目的,JVM实现者可以在垃圾回收中选择更好的模式或算法来回收内存。

  • 当finalize()被调用的时候,JVM释放掉当前线程的所有同步块。

Example Program for GC Scope

class GCScope {         GCScope t;         static int i = 1;          public static void main(String args[]) {             GCScope t1 = new GCScope();             GCScope t2 = new GCScope();             GCScope t3 = new GCScope();             //没有任何一个对象是可以被GC的             t1.t = t2;//没有任何一个对象是可以被GC的             t2.t = t3;//没有任何一个对象是可以被GC的             t3.t = t1;//没有任何一个对象是可以被GC的              t1 = null;//没有任何一个对象是可以被GC的,t3.t还有对t1的引用              t2 = null;//没有任何一个对象是可以被GC的,t3.t.t还有对t2的引用             t3 = null;//所有3个对象都可以被GC(没有一个被引用了)             //只有各个对象的变量t互相循环引用形成了一个孤立的引用环,而没有外部引用         }          protected void finalize() {             System.out.println("Garbage collected from boject" + i);             i++;         }     }

Example Program for GC OutOfMemoryError

垃圾回收机制并不保证发生内存溢出时的安全,事实上内存溢出将会导致程序的崩溃,抛出OutOfMemoryError。import java.util.LinkedList; 

import java.util.List;  public class GC {     public static void main(String[] args[]) {         List l = new LinkedList();         //进入内部***循环直接向链表中不断添加元素         do {             l.add(new String("Hello, World!");         } while (true);     } }

Output

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space     at java.util.LinkedList.linkLast(LinkedList.java:142)     at java.util.LinkedList.add(LinkedList.java:338)     at com.javapapers.java.GCScope.main(GCScope.java:12)

感谢各位的阅读,以上就是“Java垃圾回收机制怎么理解”的内容了,经过本文的学习后,相信大家对Java垃圾回收机制怎么理解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java垃圾回收机制怎么理解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么理解Java 垃圾回收机制

怎么理解Java 垃圾回收机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是自动垃圾回收自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将
2023-06-05

Java垃圾回收机制怎么理解

这篇文章主要讲解了“Java垃圾回收机制怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java垃圾回收机制怎么理解”吧!Java垃圾回收是一个自动运行的管理程序运行时使用的内存的进程
2023-06-17

怎么理解JavaScript垃圾回收机制

本篇内容介绍了“怎么理解JavaScript垃圾回收机制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!机制说明1、找出不再使用的变量,然后释
2023-06-25

理解Python垃圾回收机制

一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。#encoding=utf-8 __autho
2022-06-04

垃圾回收机制

我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是一个垃
2023-01-30

Java垃圾回收机制是什么

这篇文章主要介绍“Java垃圾回收机制是什么”,在日常操作中,相信很多人在Java垃圾回收机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java垃圾回收机制是什么”的疑惑有所帮助!接下来,请跟着小编
2023-06-17

JavaScript中的垃圾回收机制怎么理解

今天小编给大家分享一下JavaScript中的垃圾回收机制怎么理解的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。JavaSc
2023-07-06

JS中的垃圾回收机制怎么理解

这篇“JS中的垃圾回收机制怎么理解”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS中的垃圾回收机制怎么理解”文章吧。基本类
2023-07-05

Java的垃圾回收怎么理解

这篇“Java的垃圾回收怎么理解”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java的垃圾回收怎么理解”文章吧。在说记忆集
2023-06-29

python垃圾回收机制!

python的三种垃圾回收机制:1.python采用的是引用计数机制为主;2.标记-清除;为辅的策略3.分代收集(隔代回收、分代回收)为辅的策略现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存
2023-01-31

day09(垃圾回收机制)

1,复习文件处理1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写with open('
2023-01-31

Java垃圾回收机制的原理是什么

本篇内容主要讲解“Java垃圾回收机制的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java垃圾回收机制的原理是什么”吧!Java 垃圾回收机制1. 垃圾回收主要关注 Java 堆图
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录