JVM运行和类加载全过程
一、 为什么研究类加载全过程
- 有助于了解JVM运行过程
- 更深入了解java动态性(了解热部署、动态加载)提高程序的灵活性。
二、 类加载机制
JVM把class文件加载到内存,并对数据进行校验、解析和初始化、最终形成JVM可以直接使用的Java类型的过程。
—、加载
将class文件字节码内容加载到内存中,并将这些静态数据转化成方法区中的运行时数据结果,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。
二、链接
将Java类的二进制代码合并到JVM的运行状态之中的过程
验证:
确保加载的类信息符合JVM规范,没有安全方面的问题。
准备:
正式为类变量的(static变量) 分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配
解析:
虚拟机常量池内的符号引用替换为直接引用的过程。
初始化
·初始化阶段的阶段是执行类构造器()方法的过程。类构造器()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的
·当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
·虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步
·当访问一个java类的静态域时,只有真正声明这个域的类才会被初始化。
package com.lyy.test;public class Demo1 {public static void main(String[] args) throws ClassNotFoundException {A a = new A();System.out.println(A.width);}
}class A {public static int width=100; //静态变量 ,静态域 fieldstatic{System.out.println("静态初始化类A");width=300;}public A(){System.out.println("创建A类的对象");}
}
类的主动引用(一定会发生类的初始化)
- New一个类的对象
- 调用类的静态成员(除了final常量)和静态方法
- 使用java.lang.reflect包的方法对类进行反射调用
- 当虚拟机启动,java Hello ,则一定会初始化Hello类,说白了就是先启动main方法所在的类
- 当初始化一个类,如果其父类没有被初始化,则先会初始化他的父类
类的被动引用(不会发生类的初始化)
- 访问一个静态域时,只有真正声名这个域的类才会被初始化
- 通过子类引用父类的静态变量,不会导致子类初始化
- 通过数组定义类引用,不会触发此类的初始化
- 引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了)
package com.lyy.test;public class Demo1 {static{System.out.println("静态初始化Demo1");}public static void main(String[] args) throws ClassNotFoundException {System.out.println("Demo1的main方法");
// A a = new A();
// System.out.println(A.width);
// A a2 = new A();//主动引用new A();System.out.println(A.width);Class.forName("com.lyy.test.A");//被动引用
// System.out.println(A.MAX);
// A[] as = new A[10];System.out.println(B.width);}
}class B extends A{static{System.out.println("静态初始化B");}
}class A extends A_Father{public static int width=100; //静态变量 ,静态域 fieldpublic static final int MAX=100;static{System.out.println("静态初始化类A");width=300;}public A(){System.out.println("创建A类的对象");}
}class A_Father extends Object{static {System.out.println("静态初始化A_Father");}
}
JVM运行和类加载全过程相关推荐
- 第六篇 JVM核心机制之JVM运行和类加载全过程(一)
JVM核心之JVM运行和类加载全过程 为什么研究类加载全过程? 有助于连接JVM运行过程 更深入了解java动态性(解热部署,动态加载),提高程序的灵活性 类加载机制 JVM把class文件加载到内存 ...
- JVM核心之JVM运行和类加载全过程
为什么研究类加载全过程? 有助于连接JVM运行过程 更深入了解java动态性(解热部署,动态加载),提高程序的灵活性 类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终 ...
- JVM核心——JVM运行和类加载全过程
1.类加载全过程 (1)类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成JVM可以直接使用的Java类型的过程. 加载 将class文件字节码内容加载到内存中,并 ...
- 第七篇 JVM核心机制之JVM运行和类加载全过程(二)
分析: 说明: 内存中存在栈.堆(放创建好的对象).方法区(实际也是一种特殊堆) 1.JVM加载Demo01时候,首先在方法区中形成Demo01类对应静态数据(类变量.类方法.代码-),同时在堆里面 ...
- 第十篇 JVM核心机制之JVM运行和类加载全过程(五)
加密.解密操作 加密操作 1 /** 2 * 3 * 加密操作 4 * 5 * @author Zhang XiaoDao 6 * 7 */ 8 public class EncrpUtil { 9 ...
- 【随笔】JVM核心:JVM运行和类加载
前言 本篇博客将写一点关于JVM的东西,涉及JVM运行时数据区.类加载的过程.类加载器.ClassLoader.双亲委派机制.自定义类加载器等,这些都是博主自己的一点理解,如果有误,欢迎大家评论拍砖~ ...
- jvm运行时类加载机制_JVM体系结构:JVM类加载器和运行时数据区
jvm运行时类加载机制 各位读者好! 在JVM系列的上一篇文章中,开发人员了解了Java虚拟机(JVM)及其体系结构. 本教程将帮助开发人员正确回答以下主题的问题: ClassLoader子系统 运行 ...
- JVM 运行流程、类加载、垃圾回收
一.JVM 简介 1.JVM JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机. 虚拟机是指通过软件模拟的具有完整硬件功能的.运行在一个完全隔离的环境中的完整计算机 ...
- 【转载】Java JVM 运行机制及基本原理
原博地址:https://zhuanlan.zhihu.com/p/25713880 JVM的基础概念 JVM的中文名称叫Java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机. JVM也充 ...
最新文章
- getElementById()方法取值
- Android入门(13)| Android权限 与 内容提供器
- 美国纽约法院定于明年3月对BitMEX前高管进行审判
- [转]Authority-check
- c语言计算10亿位圆周率,C语言:圆周率的计算
- 360安全软件设置白名单
- c语言程序设计的删除函数,详解C语言中的rename()函数和remove()函数的使用方法
- 办公小技巧:excel纸张大小设置
- 编译原理 —— 什么是语法分析
- java 多个PDF合成一个
- String 字符串之截取
- java中的枚举与注解
- 【hihocoder】#1082 : 然而沼跃鱼早就看穿了一切
- Server SQL 2008 练习
- 百度地图TextureMapView变黑
- Photoshop-预览图片的方式
- 使用ContentResolver操作手机系统联系人
- 计算机类核刊 版面费,核心期刊的版面费怎么算
- COBIT信息及相关技术控制目标认证
- PS处理GIF 图除去白色背景后出现重影
热门文章
- Adoby photoshop cs5永久序列号
- request:fail 发生了 SSL 错误无法建立与该服务器的安全连接——openssl报漏洞该升级了
- ARM M3综合细节描述:
- 跳一跳python源码下载_微信跳一跳游戏python脚本
- DCMTK之MPPS服务实现
- html laber上下居中,laber是什么意思
- 转:Mac操作技巧 | 键盘侠必备快捷键
- 神雕侠侣服务器维修时间,神雕侠侣什么时候更新_神雕侠侣更新维护了什么内容_快吧游戏...
- uni-app 和H5页面视频播放flv格式视频监控
- java backoff_Java BackOff类代码示例