`
雨打蕉叶
  • 浏览: 236424 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java对象的生命周期 与 垃圾回收

阅读更多

创建对象的方式

  • new语句创建对象。
  • 使用反射,调用java.lang.Class或java.lang.reflect.Constructor的newInstance()实例方法。
  • 调用对象的clone()方法
  • 使用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。

 

还有其他一些隐式创建对象的方法:

 

  • 对于java命令中的每个命令行参数,Java虚拟机都会创建相应的String对象,并把它们组织到一个String数组中,再把该数组作为参数传递给程序入口main(String args[])方法。
  • String类型的直接量对应一个String对象。
  • 字符串操作符”+”的运算结果为一个新的String对象。
  • 当JVM加载一个类时,会隐含地创建描述这个类的Class实例。

 

不管采取哪种方式创建对象,JVM创建一个对象都包含以下步骤:

(1) 给对象分配内存。

(2) 将对象的实例变量自动初始化为其类型的默认值。

(3) 初始化对象,给实例变量赋予正确的初始值。

 

 

对于以上第三个步骤,JVM可采用3种方式来初始化对象,到底采用何种初始化方式取决于创建对象的方式。

 

  • 如果对象是通过clone()方法创建的,那么JVM把原来被克隆对象的实例变量的值拷贝到新对象中。
  • 如果对象通过ObjectInputStream类的readObject()方法创建的,那么JVM通过输入流中读入的序列化数据来初始化那些非暂时性的实例变量。
  • 在其他情况下,如果实例变量在声明时被显示初始化,那么就把初始化值赋给实例变量,接着再执行构造方法。这是最简单初始化对象的方式。

 

 

 

 

垃圾回收

Java语言中,内存回收任务由JVM来担当。

在程序的运行环境中,JVM提供了一个系统级的垃圾回收器线程,它负责自动回收那些无用对象所占用的内存。这种内存回收的过程被称为垃圾回收。

 

垃圾回收具有以下优点:

 

  • 程序员从复杂的内存追踪,监测和释放等工作解放出来,减轻程序员进行内存管理的负担。
  • 防止系统内存被非法释放,从而使系统更加健壮和稳定。
  • 只有当对象不再被程序中的任何引用变量引用时,它的内存才可能被回收。
  • 程序无法迫使垃圾回收器立即执行垃圾回收操作。
  • 当垃圾回收器将要回收无用对象的内存时,先调用该对象的finalize()方法,该方法有可能使对象使对象复活,导致垃圾回收器取消回收该对象的内存。

 

 

 

 

 

 

对象的可触及性

在JVM的垃圾回收器来看。堆区中的每个对象都肯能处于以下三个状态之一:

 

  • 可触及状态:当一个对象被创建后,只要程序中还有引用变量引用该对象,那么它就始终处于可触及状态。
  • 可复活状态:当程序不再有任何引用变量引用对象时,它就进入可复活状态。该状态的对象,垃圾回收器会准备释放它占用的内存,在释放前,会调用它的finalize()方法,这些finalize()方法有可能使对象重新转到可触及状态。
  • 不可触及状态:当JVM执行完所有的可复活状态的finalize()方法后,假如这些方法都没有使对象转到可触及状态。那么该对象就进入不可触及状态。只有当对象处于不可触及状态时,垃圾回收器才会真正回收它占用的内存。

 

 

 

 

 

垃圾回收的时间

    当一个对象处于可复活状态时,垃圾回收线程执行它的finalize()方法,任何使它转到不可触及状态,任何回收它占用的内存,这对于程序来说都是透明的。程序只能决定一个对象任何不再被任何引用变量引用,使得它成为可以被回收的垃圾。

 

    类比:居民把无用物品放在指定的地方,清洁工人会把它收拾走。但垃圾被收走的时间,居民是不知道的,也无需了解。

 

    垃圾回收器作为低优先级线程独立运行。在任何时候,程序都无法迫使垃圾回收器立即执行垃圾会后操作。

程序中可调用System.gc()或Runtime.gc()方法提示垃圾回收器尽快执行垃圾回收操作,但是不能保证调用后垃圾回收器会立即执行垃圾回收。

 

    类比:小区垃圾成堆时,居民打电话给环保局,催促清洁工尽快来处理垃圾。但是清洁工不一定立即就来了,也有可能很长时间后再来。

 

 

 

 

 

 

对象的finalize()方法简介

finalize()定义在Object类中:

protected void finalize() throws Throwable

因为该方法为protected,所以任何Java类都可以覆盖finalize()方法,该方法中进行释放对象所占的相关资源的操作。

 

注意:

JVM的垃圾回收操作对程序来说都是透明的。因此程序无法预料某个无用对象的finalize()方法何时被释放。

 

 

finalize()方法的特点:

 

  • 垃圾回收器是否会执行该方法及何时执行该方法,都是不确定的。
  • finalize()方法有可能使对象复活,使它恢复到可触及状态。
  • 垃圾回收器在执行finalize()方法时,如果出现异常,垃圾回收器不会报告异常,程序继续正常运行。

 

 

 

 

 

 

 

对象的强,软,弱,虚引用

 

强引用

    如果一个对象具有强引用,垃圾回收器绝不会回收它。当内存空间不足,JVM宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会考随意回收具有强引用的对象来解决内存不足的问题。

 

软引用

    如果一个对象具有软引用。如果内存空间足够。垃圾回收器不会回收它。如果内存不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。

    软引用可用来实现内存敏感的高速缓存。

 

 

弱引用

    如果一个对象具有弱引用。当垃圾回收器发现只具有弱引用对象,不管当前内存空间足够与否,都会回收它的内存。

不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现只具有弱引用的对象。

 

 

虚引用

    虚引用不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

2
3
分享到:
评论

相关推荐

    Java中对象的生命周期 ..doc

    1. **对象生命周期的开始**: - 当对象被创建时,其生命周期开始。首先需要为对象分配内存空间,在Java堆内存中进行。 - 接着,对象的实例变量会被初始化为其默认值或指定的初始值。 - 对象可以通过多种方式创建...

    Java 详解垃圾回收与对象生命周期

    Java垃圾回收与对象生命周期是Java程序设计中至关重要的概念,主要涉及到JVM内存管理机制。在Java中,垃圾回收机制负责自动管理堆内存,确保在程序运行过程中有效地使用内存资源,避免内存泄漏。 1. 垃圾回收: - ...

    java高级之垃圾回收机制

    - **老年代**:存放生命周期较长的对象。 - **栈(Stack)**:每个线程拥有自己的栈空间,主要用于存储局部变量和方法调用信息。 #### 三、垃圾回收算法 垃圾回收机制在JVM中扮演着至关重要的角色,其主要目标是...

    java内存管理与垃圾回收

    例如,“标记-清除”适合于对象生命周期较长的情况,而“复制-清除”则适用于对象生命周期较短,频繁创建和销毁的场景,因为它能提供更好的内存碎片管理。 总的来说,Java内存管理和垃圾回收机制是Java平台的基石,...

    Java垃圾回收详解

    #### 对象的生命周期与垃圾回收触发条件 当使用`new`关键字创建一个对象后,并没有相应的`delete`操作来显式地释放该对象所占用的内存。在完成对某个对象的使用后,可以通过以下方式停止该对象的引用: - 将引用...

    Java对象生命周期管理.pdf

    总的来说,Java对象生命周期管理是一个复杂且细致的主题,涉及到内存分配、垃圾收集策略、性能优化等多个方面。开发者需要深入理解这些概念,以便在编写代码时做出最佳决策,以确保程序的稳定性和效率。

    Java与C#的垃圾回收机制

    ### Java与C#的垃圾回收机制 #### 一、引言 在现代编程语言中,内存管理是一项重要的功能,能够显著提升程序的稳定性和效率。本文将深入对比Java与C#这两种广泛使用的编程语言中的垃圾回收机制,帮助开发者更好地...

    Java垃圾回收原理

    新生代中的对象生命周期通常较短,因此这里频繁发生垃圾回收;而老年代的对象生命周期较长,垃圾回收频率较低。分代收集理论利用这一特点,提高垃圾回收效率。 ##### 4.2 内存分配与回收 当新对象创建时,首先尝试...

    Java垃圾回收机制总结

    该算法的主要思想是,根据对象的生命周期将其分为不同的代(Generation),然后根据不同的代采用不同的垃圾回收策略。该算法的优点是可以有效地防止内存泄露和有效地使用空闲的内存。 Java中的垃圾回收机制主要使用...

    java垃圾回收器代码举例

    - Java内存管理的核心是对象生命周期的管理,当一个对象不再被引用时,垃圾回收器会将其占用的内存空间回收。 2. **垃圾回收器的工作原理** - **可达性分析**:垃圾回收器通过一系列称为“根”(如局部变量、静态...

    java C#垃圾回收算法分析

    新生代对象生命周期短,使用复制算法;老年代对象生存时间长,使用标记-清除或标记-整理算法。 - **增量收集(Incremental GC)**:为了减少长时间暂停(Stop-the-World)现象,将垃圾回收过程分成多个小步骤,每次...

    Java虚拟机和Java程序的生命周期?

    ### Java虚拟机与Java程序的生命周期 #### 一、Java虚拟机(JVM)概述 Java虚拟机(JVM)是一种可以执行Java字节码的虚拟机。它为Java应用程序提供了一个独立于硬件平台的运行环境,使得Java程序可以在任何安装了JVM...

    JAVA垃圾回收面试个人总结.doc

    其中,程序计数器、虚拟机栈和本地方法栈与线程生命周期同步,而垃圾回收主要关注的是Java堆和方法区。Java堆用于存储对象实例,方法区则存放类的信息,如类的静态变量和常量池。 在垃圾回收中,主要关注的是对象的...

    Java对象的生命周期[参照].pdf

    在这个过程中,理解JVM(Java虚拟机)的角色至关重要,因为它是对象生命周期的主要管理者。 首先,让我们了解一下JVM的结构。JVM是Java虚拟机的缩写,它的主要任务是执行符合Java字节码规范的.class文件。JRE(Java...

    Java内存与垃圾回收调优.docx

    分代收集则是根据对象生命周期划分不同区域,分别进行垃圾回收,以提高效率。 调优过程中,使用工具监控GC性能是必不可少的。JConsole、VisualVM和JMC(Java Mission Control)等工具能帮助我们查看GC日志,分析...

    JAVA垃圾回收机制

    Java垃圾回收机制(GC)是Java编程语言的关键特性,它自动管理内存,释放不再使用的对象,以防止内存泄漏。GC的运作方式主要有两种策略:引用计数和对象引用遍历。 引用计数是一种简单但不完美的方法。每个对象都有...

    Java Garbage Collection Study java 垃圾回收学习

    Java垃圾回收(Garbage Collection,简称GC)是Java运行时环境(JRE)中的一个关键特性,它自动管理对象的生命周期,释放不再使用的对象所占用的内存空间。在Java中,对象在不再被任何引用链可达时,即被视为垃圾,...

Global site tag (gtag.js) - Google Analytics