一旦一个类被装载、连接和初始化,它就随时可以被使用。程序可以访问它的静态字段,调用它的静态方法,或者创建它的实例。作为Java程序员有必要了解Java对象的生命周期。

类实例化

在Java程序中,类可以被明确或隐含地实例化。明确的实例化类有四种途径:

明确调用new。

调用Class或者java.lang.reflect.Constructor对象的newInstance方法。

调用任何现有对象的clone。

通过java.io.ObjectInputStream.getObject()反序列化。

隐含的实例化:

可能是保存命令行参数的String对象。

对于Java虚拟机装载的每个类,都会暗中实例化一个Class对象来代表这个类型

当Java虚拟机装载了在常量池中包含CONSTANT_String_info入口的类的时候,它会创建新的String对象来表示这些常量字符串。

执行包含字符串连接操作符的表达式会产生新的对象。

Java编译器为它编译的每个类至少生成一个实例初始化方法。在Java class文件中,这个方法被称为。针对源代码中每个类的构造方法,Java编译器都会产生一个()方法。如果累没有明确的声明任何构造方法,编译器会默认产生一个无参数的构造方法,它仅仅调用父类的无参构造方法。

一个()中可能包含三种代码:调用另一个()、实现对任何实例变量的初始化、构造方法体的代码。

如果构造方法明确的调用了同一个类中的另一个构造方法(this()),那么它对应的()由两部分组成:

一个同类的()的调用。

实现了对应构造方法的方法体的字节码。

在它对应的()方法中不会有父类的(),但不代表不会调用父类的(),因为this()中也会调用父类()

如果构造方法不是通过一个this()调用开始的,而且这个对象不是Object,()则有三部分组成:

一个父类的()调用。如果这个类是Object,则没有这个部分

任意实例变量初始化方法的字节码。

实现了对应构造方法的方法体的字节码。

如果构造方法明确的调用父类的构造方法super()开始,它的()会调用对应父类的()。比如,如果一个构造方法明确的调用super(int,String)开始,对应的()会从调用父类的(int,String)方法开始。如果构造方法没有明确地从this()或super()开始,对应的()默认会调用父类的无参()。

垃圾收集和对象的终结

程序可以明确或隐含的为对象分配内存,但不能明确的释放内存。一个对象不再为程序引用,虚拟机必须回事那部分内存。

卸载类

在很多方面,Java虚拟机中类的生命周期和对象的生命周期很相似。当程序不再使用某个类的时候,可以选择卸载它们。

类的垃圾收集和卸载值所以在Java虚拟机中很重要,是因为Java程序可以在运行时通过用户自定义的类装载器装载类型来动态的扩展程序。所有被装载的类型都在方法区占据内存空间。

Java虚拟机通过判断类是否在被引用来进行垃圾收集。判断动态装载的类的Class实例在正常的垃圾收集过程中是否可触及有两种方式:

如果程序保持非Class实例的明确引用。

如果在堆中还存在一个可触及的对象,在方法区中它的类型数据指向一个Class实例。

touch-class-instance.png

java 对象 jvm生命_JVM对象的生命周期相关推荐

  1. java设置jvm内存_JVM(java 虚拟机)内存设置

    一.设置JVM内存设置 1. 设置JVM内存的参数有四个: -Xmx    Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定: -Xmx 此设置 ...

  2. 在java中jvm目录_JVM具体在哪个文件夹下的

    \jdk1.6.0 -- JDK的根目录,包含一些软件版权,声明,和自述文件, 同时包含归档了的Java平台源代码包src.zip \jdk1.6.0\bin -- JDK包含的一些开发工具执行文件 ...

  3. 【深入Java虚拟机JVM 05】HotSpot对象探秘

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 介绍完Java虚拟机的运行时数据区之后,我们大致知道了虚拟机内存的概况,读者了解了内存中放了些什么后 ...

  4. 64位java_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?

    点击上方石杉的架构笔记,右上选择"设为星标" 每日早8点半,精品技术文章准时送上 往期文章 BAT 面试官是如何360°无死角考察候选人的(上篇) 每秒上万并发下的Spring C ...

  5. java jvm对象_【Java】JVM

    在 HotSpot 虚拟机中,一个对象在内存中存储的布局可以分为三块区域:对象头(Object Header).实例数据(Instance Data)和对齐填充(Padding). 当我们在 Java ...

  6. java中Mark接口_JVM源码分析之Java对象头实现

    原标题:JVM源码分析之Java对象头实现 原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 "365篇原创计划"第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Ja ...

  7. sqlserver2008未将对象引用设置到对象的实例_JVM | Java对象的创建、存储和访问详解...

    引言   Java程序员都知道如何创建对象,不就是一个Person person = new Person()的语句就解决了么?然而,我们只知道new,却对于底层如何实现对象的创建.如何存储到内存中去 ...

  8. java对象gc恢复_JVM垃圾回收与对象状态

    看到JVM就不得不说垃圾回收,说到垃圾回收(Garbage Collection,GC),顾名思义,垃圾回收就是释放垃圾占用的空间,在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切 ...

  9. java对象添加字段_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?

    在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的new语句之外,我们还可以通过反射机制.Object.clone方法.反序列化以及Unsafe.allocateInstance 方法来 ...

最新文章

  1. BZOJ 1208 宠物饲养所 Splay
  2. 洛谷P1119 灾后重建
  3. Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round) A. Basic Diplomacy
  4. JAVAWEB入门之Servlet_体系结构
  5. python两列数据相关性_使用.corr获取两列之间的相关性
  6. 深和jsonp【转】 jsonpk跨域问题详解
  7. React基础篇(四)之创建组件方式分析
  8. 23种设计模式(4)-生成器模式
  9. 命名实体识别_命名实体识别的几种标注形式
  10. 四阶龙格库塔法解一维扩散方程
  11. 借助创客匠人玩转视频号
  12. golang interface 与 反射
  13. 关于 电子护照 的基本小常识问答
  14. 云原生|kubernetes|minikube的部署安装完全手册(修订版)
  15. 苹果iOS/iPadOS 15.2 Beta 1发布 app隐私报告?
  16. 英语对于程序员重要吗?
  17. 仿网易云音乐日推界面(监听AppBarLayout滑动+动态高斯模糊)
  18. 几种常见的定位技术,GPS定位,北斗定位,基站定位,蓝牙定位,WIFI定位比较--新导智能
  19. 北京大学可视化发展前沿研究生暑期学校Day3
  20. python 条件概率_NLTK中的条件概率分布

热门文章

  1. 居然还有这种游戏...是不是有点刺激过头了啊...
  2. 数据库分库分表解决方案汇总
  3. 疑案追踪:Spring Boot内存泄露排查记
  4. overflow encountered in exp
  5. python opencv 归一化
  6. python获取硬件信息
  7. android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcessor'
  8. Non-ASCII character '\xe6'
  9. android EditText显示不全
  10. penalized_tanh可视化