`
雨打蕉叶
  • 浏览: 232259 次
  • 性别: 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 详解垃圾回收与对象生命周期

    主要介绍了Java 详解垃圾回收与对象生命周期的相关资料,这里对堆内存与栈内存进行详解及JVM 的生命周期介绍,需要的朋友可以参考下

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

    Java内存与垃圾回收调优,Java内存与垃圾回收的调优是一个重要的主题,特别是在高性能和大规模的应用程序中。以下是一些关键的调优建议和步骤: 理解内存结构: Java堆是主要的内存区域,用于存储对象实例。 堆内存...

    类和对象的生命周期

    目录1、类加载2、使用2.1对象实例化2.1.1 为Student对象分配空间2.1.2对象的内存布局2.1.3对象的访问定位直接访问句柄访问2.2、垃圾收集2.2.1、回收区域、何时回收2.2.1.1 回收内容(可达性分析算法)2.2.2、如何...

    Java零基础-对象的创建和使用-内存分析.md

    了解对象的生命周期和垃圾回收机制。 阅读建议: 阅读前建议已具备基本的Java语法知识和编程经验。 请按照顺序阅读对象的创建、内存分配和使用的部分,确保理解每一部分的内容。 在阅读示例代码时,结合自己的实际...

    java经典面试题目-面经-java-Java语言的进阶概念-常用的库和框架-并发编程-网络编程-Web开发-面经

    Java中的GC(垃圾回收)是什么?如何手动触发对象的垃圾回收? 什么是Java中的设计模式?列举一些常见的设计模式。 什么是Java中的单例模式?如何实现线程安全的单例模式? 什么是Java中的生命周期回调方法?列举...

    java虚拟机(jvm)介绍以及相关参数设置与调优

    虚拟机的相关参数设置与调优,介绍了一些jvm的体系结构,垃圾回收的方法,java对象的生命周期与分代。

    java高级工程师、技术专家、架构师、项目经理面试宝典.rar

    2.Java对象的生命周期 答:创建阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间重新分配阶段等等。 3.Map或者HashMap的存储原理 答:HashMap是由数组+链表的一个结构组成。

    笔记,2、内存分配与回收策略~深入理解垃圾回收器1

    3、写代码有好处栈:栈中的生命周期是跟随线程,所以一般不需要关注堆:堆中的对象是垃圾回收的重点方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,一般

    预习,2、内存分配与回收策略~深入理解垃圾回收器1

    3、写代码有好处栈:栈中的生命周期是跟随线程,所以一般不需要关注堆:堆中的对象是垃圾回收的重点方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,一般

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    JVM执行引擎和垃圾回收 基础语法 理解Java中对象基础Object类 基本数据类型,核心点整理 特殊的String类,以及相关扩展API 日期与时间API详解 流程控制语句,和算法应用 函数式编程概念和应用 集合容器 基于分析...

    21天学会Java之(Java SE第四篇):Java虚拟机、垃圾回收机制

    文章目录Java虚拟机(JVM)JVM的基本结构类加载机制类的生命周期类加载器的种类类加载机制运行时数据区(内存分析)垃圾回收机制新生代(Young Generation)老年代(Old Generation)元空间(Meta Space) Java虚拟机...

    [java]读书笔记整理:一切都是对象

    Java对象不具备和基本类型一样的生命周期。当用new创建一个java对象时,它可以存活于作用域之外。所以假如你采用代码: { String s=new String(”this is a string”) ; } 引用s在作用域终点就消失了。然而,...

    mysql面试题-mysql经典面试题目-数据库的基本概念-SQL语法-事务处理-索引优化-性能调优-mysql-面试题目

    Java中的GC(垃圾回收)是什么?如何手动触发对象的垃圾回收? 什么是Java中的设计模式?列举一些常见的设计模式。 什么是Java中的单例模式?如何实现线程安全的单例模式? 什么是Java中的生命周期回调方法?列举...

    Java后端面试问题整理.docx

    • 熟悉Java多线程并发中线程基本方法,线程池,线程生命周期,熟悉Java锁中常见锁分类(乐观/悲观锁、自旋锁、独/共享锁、可重入锁、公平/非公平锁、分段锁、偏向锁,轻/重量级锁)和基本的锁升级策略

    Java清华教程.rar

     ■ Java语言的基础知识:Java语言的主要特点,设计思想,Java虚拟机,垃圾回收机制,安全性的保证机制;  ■ Java语言的基本语法规范,包括标识符、关键字、数据类型、表达式和流控制,程序基本结构;  ■ ...

    Android中的内存泄漏

    长生命周期的对象持有了短生命周期的对象,从而导致短生命周期的对象不能被释放 垃圾回收机制 垃圾回收机制分为:引用计数法、可达性分析法 引用计数法(有循环引用的问题):Python、Object-C、Swift 用一个计数器...

    最新java面试专题01-JVM

    JVM生命周期:JVM的生命周期始于启动一个Java程序,此时会创建一个JVM实例。程序中的public static void main(String[] args)方法作为JVM实例运行的起点。 垃圾收集:JVM具有自动内存管理和垃圾收集机制,用于自动...

    Java面试技术面知识扩展包第三弹.rar

    开发者不需要手动进行内存分配和释放,通过“对象生命周期”的概念,垃圾收集器会自动回收不再使用的内存。 4. 异常处理:Java提供了异常处理机制,可以在出现异常情况时捕获、处理并恢复程序的运行。通过try-catch...

Global site tag (gtag.js) - Google Analytics