`

JVM学习笔记五 之 装载(类型的生命周期系列)

    博客分类:
  • jvm
阅读更多

一、概述

      类型的生命周期分为装载、连接、初始化、实例的生命周期(使用)和卸载(实例化算是类型生命周期的一部分么?)。装载是指把表示类型信息的二进制字节码装入到内存。连接阶段包括验证、准备和解析,验证包括语法、语义、字节码流和引用验证;准备是给类变量分配内存并赋默认值;解析是把符号引用解析为直接饮用。初始化阶段是给静态变量赋值,包括静态语句和静态块里边的赋值操作。实例的生命周期阶段就包括类型实例的创建、实例的使用、实例占用内存的回收(gc)。卸载就是把类型信息占用的内存回收掉。

装载、连接和初始化三个阶段的界线在逻辑上是划分的很清晰的,但是在实际的实际过程中,除了开始时间点是跟逻辑上的先后顺序一致,具体的过程却是交叉进行的。

二、装载

      装载就是用ClassLoader把二进制字节码装载进jvm的,具体包括三个步骤:

1、根据类型的全限定名,加载二进制字节码到jvm的方法区中。此处方法区是个逻辑区域,在HotSpot VM中是非堆内存(NonHeap)的永生代(PermGen)部分。当然在别的虚拟中可能没有非堆内存这个叫法

2、把二进制静态字节码信息转化成运行期数据结构,如把静态常量池映射成运行期常量池,为字段信息、类型描述信息、超类信息、方法字节码信息等分配内存。

3、为类型信息创建java.lang.Class实例对象,该对象放在堆中,做为程序访问方法区中类型数据的外部接口。方法区中类型信息会持有一个到该java.lang.Class实例的引用,同时还会有一个到加载该类型信息的ClassLoader的一个引用。(此阶段应该在跟连接阶段交叉在一起吧,至少先验证字节码的正确性)

此处并没有要求二进制字节码是从何处得到,有了ClassLoader,开发人员可以通过很多地方获得,比如从磁盘单个class文件、目录、jar包、网络请求获得、动态生成如jsp编译成Servlet、自己拼装字节码如Proxy.getProxyClass或者通过第三方操纵字节码的类库获得如cglib。

装载阶段也是类型生命周期中java开发人员可控性最强的阶段,开发人员可以通过实现自定义的ClassLoader去控制获取二进制字节码流的方式(当然也可以自己拼装字节码),如OSGi、Tomcat都有独特的应用

三、什么时候装载一个类

jvm spec中规定在首次主动使用一个对象的时候会初始化一个类,因为初始化之前有装载和连接,所以也是触发连接的条件:

1、创建类的新实例new

2、调用类的静态方法invokestatic

3、调用类的静态非常两字段putstatic、getstatic

4、通过反射调用一个类

5、初始化一个类的子类的时候

6、jvm启动的初始化类

在被动使用一个类的时候,不会触发该类的装载。调用静态非常量字段只有当类或者接口的确声明了这个字段时才是主动调用。如超类或接口中声明了一个静态变量,但是通过子类或子接口调用的,此时对子类来说就是被动使用,不会触发子类的装载。

分享到:
评论
1 楼 javaroad 2011-10-20  
很不错。一看就知道是牛人出手。

相关推荐

    java之jvm学习笔记五(实践写自己的类装载器)

    这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...

    JVM学习笔记(一)

    本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM的各种运行时信息,包括但不限于JVM进程与参数查看、垃圾收集信息、JVM锁信息等内容。 #### 二、查看JVM进程及参数 ##### 1. JPS - **用途**:列出主机上...

    java之jvm学习笔记十一(访问控制器)-源码

    本文将深入探讨JVM中的访问控制器,主要基于“java之jvm学习笔记十一(访问控制器)-源码”这一主题,以及相关的源码分析。 首先,我们得了解Java的安全模型。Java安全模型基于一种称为安全管理器(SecurityManager)...

    JVM学习笔记.docx

    本篇JVM学习笔记主要涵盖了以下几个核心知识点: 1. **运行时数据区**: - **程序计数器**:记录当前线程执行的字节码的行号,用于线程恢复执行时跳转到正确位置。 - **Java虚拟机栈**:每个方法执行时创建的栈帧...

    JVM学习笔记

    ### JVM学习笔记 #### JVM内存模型 (JMM) JVM内存模型主要分为以下几个部分: - **Java堆**:这是所有线程共享的一块区域,在虚拟机启动时创建。主要用于存放对象实例,几乎所有的对象实例都在这里分配内存。 - *...

    JVM学习资料+笔记

    这个资料包不仅涵盖了理论知识,还包含个人的学习笔记,对于学习和掌握JVM的各个方面都将大有裨益。无论是初学者还是经验丰富的开发者,都可以从中找到提升自己技能的宝贵资源。通过深入学习和实践,可以更好地理解...

    马士兵jvm调优笔记.docx

    ### 马士兵JVM调优笔记知识点梳理 #### 一、Java内存结构 Java程序运行时,其内存被划分为几个不同的区域,包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、程序计数器(Program Counter Register)以及...

    JVM学习笔记(缓慢更新).md

    JVM学习笔记(缓慢更新).md

    jVM学习笔记.ppt

    JVM的学习可以从其基本结构、代码编译和执行过程,以及内存管理和垃圾回收机制三个方面进行深入探讨。 首先,JVM的基本结构分为逻辑结构和物理结构。逻辑结构主要包括Java源码编译器、JVM执行引擎、类加载器等组件...

    jvm视频及笔记

    "jvm视频及笔记"这个资源显然是一份全面学习JVM的材料,结合了视频教程和书面笔记,帮助学习者深入理解JVM的工作原理及其在实际开发中的应用。 JVM的学习可以从以下几个重要的知识点开始: 1. **JVM架构**:JVM...

    JVM中对象的生命周期

    在Java虚拟机(JVM)中,对象的生命周期包含了多个阶段,这些阶段共同决定了一个对象从诞生到消亡的过程。以下是这些阶段的详细介绍: **创建阶段(Creation)** 在这个阶段,对象从无到有,主要经历以下几个步骤:...

    JVM学习笔记2018-4-151

    `Allocate` 和 `Deallocate` 方法是JVM实现自动内存管理的基础,它们确保了对象生命周期的正确管理。 然后,我们转向系统知识部分,特别是虚拟内存的概念。虚拟内存是现代操作系统中一个核心特性,它允许程序认为...

    jvm学习笔记.zip

    4. **减少内存泄漏**:避免创建过多的短生命周期对象,尤其是大数据量的集合,这可能会导致新生代频繁触发垃圾收集。 5. **代码优化**:良好的编程习惯可以降低GC压力,如及时释放不再使用的对象引用,避免使用静态...

    JVM学习笔记核心知识点整理

    ### JVM学习笔记核心知识点整理 #### 一、引言与背景 随着软件开发技术的不断发展,Java作为一种广泛应用的编程语言,其背后的核心技术——Java虚拟机(JVM)的重要性日益凸显。掌握JVM不仅可以帮助开发者更好地理解...

    jvm中篇笔记.md

    ### JVM中篇笔记知识点 #### 一、Class 文件结构 ##### 1. 概述 - **字节码文件的跨平台性** - Java 的跨平台性体现在 "Write Once, Run Anywhere" (WORA),即一次编写,到处运行。Java 语言编写的源代码在编译...

    JVM 学习笔记(Java虚拟机)

    **JVM学习笔记(Java虚拟机)** Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序运行的平台,负责解释和执行字节码。深入理解JVM对于优化Java应用程序性能至关重要。本笔记将从以下几个方面详细介绍JVM:...

    JVM工作原理学习笔记

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的工作...这本《JVM工作原理学习笔记》应包含了这些内容的详细讲解,对于学习和提升JVM相关知识极具价值。

    JVM的学习笔记PDF版

    这份“JVM的学习笔记PDF版”应该包含了关于JVM的详细信息,帮助学习者深入理解这个复杂的系统。JVM允许Java代码跨平台运行,通过解释器、类加载器、垃圾收集器等组件实现“一次编写,到处运行”的理念。 1. **JVM...

    jvm学习笔记

    《JVM学习笔记》 Java虚拟机(JVM)是Java平台的核心组成部分,它负责运行所有的Java应用程序。这篇笔记将深入探讨JVM的工作原理、内存管理、类加载机制以及优化策略,帮助读者全面理解JVM并提升Java程序的性能。 ...

    JVM 学习笔记

    NULL 博文链接:https://cooldatabase.iteye.com/blog/634599

Global site tag (gtag.js) - Google Analytics