JVM初始化类契机】的更多相关文章

* 对于初始化只有主动使用类字段时才会初始化<br> * 除非对一个类的主动引用,否则所有引用类的方式都不会触发其初始化<br> * 主动引用有且只有以下场景:<p> * 遇到new .getstatic.putstatic或invokestatic者四条字节码指令时,如果类没有进行初始化,则需要先触发其初始化. * 对应的JAVA代码场景是 1)new 实例对象.读取或设置一个类的静态字段[被final修饰.已在编译器把结果放入常量池的静态字段除外]时候,以及调用一个…
在<深入理解Java虚拟机>(第二版,周志明著)中,作者介绍了JVM必须初始化类(或接口)的五种情况,但是是针对JDK7而言的. 那么,在JDK8中,这几种情况有没有变化呢?(我猜测应该会有扩展) 接下来我们探讨一下JDK8中JVM类的初始化这一部分内容. 官方文档为The Java® Virtual Machine Specification, Java SE 8 Edition, 2015-02-13. 类的初始化部分在https://docs.oracle.com/javase/spec…
在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式.从单例的五种实现方式中我们可以看到程序员对性能的不懈追求.下面我将分析单例的五种实现方式的优缺点,并对其在多线程环境下的性能进行测试. 实现 单例模式适用于资源占用较多的类,保证一个类只有一个实例即单例.通用的做法就是构造器私有化,提供一个全局的访问点,返回类的实例. uml图: 这里写图片描述 1.饿汉式 代码实现: package com.zgh.gof23.singleton;/** * 饿汉式 * @author yu…
在<深入理解 Java 虚拟机>(第二版,周志明著)中,作者介绍了 JVM 必须初始化类(或接口)的五种情况,但是是针对 JDK 7 而言的. 那么,在 JDK 8 中,这几种情况有没有变化呢?(我猜测应该会有扩展) 接下来我们探讨一下 JDK 8 中 JVM 类的初始化这一部分内容. 官方文档为 The Java® Virtual Machine Specification, Java SE 8 Edition, 2015-02-13. 类的初始化部分在 https://docs.oracl…
首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默认初值?什么时候会为变量赋程序设定的初值? 5.类加载器是什么? 6.如何编写一个自定义的类加载器? 首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class).而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验.转换解析.初始化,使这些数…
Java类的加载是由类加载器来完成的,过程如下: 首先,加载是把硬盘.网络.数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用来描述该类,再在方法区存放这些二进制数据,用来保存类对应的数据结构 Java的类加载器有哪些? 下面的String对象是由bootstrap根类加载器加载的,而自定义类C是由系统加载器加载的: /** * 源文档中这样描述: * Some implementations may use null t…
[深入Java虚拟机]之三:类初始化 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码. 1,下面说的初始化主要是类变量的初始化,实例变量的初始化触发条件不同(一般是new() ,instance()),相对简单很多.2,类变量的初始化话,是由编译期自动生成的静态构造器完成的.如果有静态语句块会被合并到静态构造器中. 补充:Java中类变量和实例变量的初始化 1,只有四种情况必须对类进行初始化: ,遇到new.getstatic.putstatic.invo…
(1)阿里的面试官问我,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的字节码进行修改 答案:可以,使用Java探针技术,可以参考:Java探针-Java Agent技术-阿里面试题 阅读目录 什么是类加载器   类加载器与类的”相同“判断   类加载器种类  双亲委派模型  类加载过程  自定义类加载器  JAVA热部署实现 什么是类加载器 负责读取 Java 字节代码,并转…
[深入Java虚拟机]之四:类加载机制 1,从Java虚拟机的角度,只存在两种不同的类加载器: 1,启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有其他的虚拟机是用Java语言实现的),是虚拟机自身的一部分. 2,其他的类加载器:这些类加载器都由Java语言实现,独立于虚拟机之外,并且全部继承自抽象类java.lang.ClassLoader, 这些类加载器需要由启动类加载器加载到内存中之后才能去加载其他的类. 2,从Java开发人员的角度来看,类…
jvm先装载类,再链接类,再初始化类(以代码的文本顺序执行类变量初始化器.类静态初始化方法或接口的属性(field)初始化器),完成类的初始化后,才执行类的main方法.在链接过程中,可以静态链接(解析),也可以动态链接(解析),下面的图例说明的是动态链接. 转自:http://dryr.blog.163.com/blog/static/5821101320107143513109/…