第七篇 JVM核心机制之JVM运行和类加载全过程(二)
分析:
说明:
内存中存在栈、堆(放创建好的对象)、方法区(实际也是一种特殊堆)
1、JVM加载Demo01时候,首先在方法区中形成Demo01类对应静态数据(类变量、类方法、代码…),同时在堆里面也会形成java.lang.Class对象(反射对象),代表Demo01类,通过对象可以访问到类二进制结构。然后加载变量A类信息,同时也会在堆里面形成a对象,代表A类。
2、main方法执行时会在栈里面形成main方法栈帧,一个方法对应一个栈帧。如果main方法调用了别的方法,会在栈里面挨个往里压,main方法里面有个局部变量A类型的a,一开始a值为null,通过new调用类A的构造器,栈里面生成A()方法同时堆里面生成A对象,然后把A对象地址付给栈中的a,此时a拥有A对象地址。
3、当调用A.width时,调用方法区数据。
当类被引用的加载,类只会加载一次
类的主动引用(一定会发生类的初始化)
①new一个类的对象
②调用类的静态成员(除了final常量)和静态方法
③使用java.lang.reflect包的方法对类进行反射调用
④当虚拟机启动,java Demo01,则一定会初始化Demo01类,说白了就是先启动main方法所在的类
⑤当初始化一个类,如果其父类没有被初始化,则先初始化它父类
类的被动引用(不会发生类的初始化)
①当访问一个静态域时,只有真正声名这个域的类才会被初始化
②通过子类引用父类的静态变量,不会导致子类初始化
③通过数组定义类的引用,不会触发此类初始化
④引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了)
1 public class Demo01 { 2 static{ 3 System.out.println("静态初始化demo01"); 4 } 5 6 public static void main(String[] args) { 7 System.out.println("静态初始化demo01.main"); 8 /*String str = "aaa"; 9 int a = 23435;*/ 10 //调用A类的方法 11 A a = new A(); 12 13 //通过反射调用 14 /* try { 15 Class.forName("com.zzp.A"); 16 } catch (ClassNotFoundException e) { 17 e.printStackTrace(); 18 }*/ 19 20 //注意打印出来的width的值和程序执行的顺序 21 //主动引用 22 // System.out.println(a.width); 23 24 //被动引用 25 // System.out.println(a.b); 26 27 //数组初始化 28 //A[] as = new A[10]; 29 30 System.out.println(B.width); 31 } 32 } 33 34 //创建一个B类,继承A 35 class B extends A{ 36 static{ 37 System.out.println("静态初始化B"); 38 } 39 } 40 41 42 class A extends A_Father{ 43 public static int width = 100; 44 public static final int b= 100; 45 static{ 46 System.out.println("静态初始化A"); 47 width = 300; 48 } 49 public A(){ 50 System.out.println("创建A类的对象"); 51 } 52 } 53 54 class A_Father{ 55 static{ 56 System.out.println("静态初始化A_Father"); 57 } 58 }
转载于:https://www.cnblogs.com/zhangzhipeng001/p/9135690.html
第七篇 JVM核心机制之JVM运行和类加载全过程(二)相关推荐
- 第六篇 JVM核心机制之JVM运行和类加载全过程(一)
JVM核心之JVM运行和类加载全过程 为什么研究类加载全过程? 有助于连接JVM运行过程 更深入了解java动态性(解热部署,动态加载),提高程序的灵活性 类加载机制 JVM把class文件加载到内存 ...
- 第十篇 JVM核心机制之JVM运行和类加载全过程(五)
加密.解密操作 加密操作 1 /** 2 * 3 * 加密操作 4 * 5 * @author Zhang XiaoDao 6 * 7 */ 8 public class EncrpUtil { 9 ...
- JVM核心——JVM运行和类加载全过程
1.类加载全过程 (1)类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成JVM可以直接使用的Java类型的过程. 加载 将class文件字节码内容加载到内存中,并 ...
- JVM核心之JVM运行和类加载全过程
为什么研究类加载全过程? 有助于连接JVM运行过程 更深入了解java动态性(解热部署,动态加载),提高程序的灵活性 类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终 ...
- JVM运行和类加载全过程
一. 为什么研究类加载全过程 有助于了解JVM运行过程 更深入了解java动态性(了解热部署.动态加载)提高程序的灵活性. 二. 类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和 ...
- JVM核心知识体系(转http://www.cnblogs.com/wxdlut/p/10670871.html)
1.问题 1.如何理解类文件结构布局? 2.如何应用类加载器的工作原理进行将应用辗转腾挪? 3.热部署与热替换有何区别,如何隔离类冲突? 4.JVM如何管理内存,有何内存淘汰机制? 5.JVM执行引擎 ...
- 第七篇:双管齐下,JVM内部优化与JVM性能调优
文章目录 一.前言 二.编译时优化 2.1 Javac编译器 2.2 Java语法糖 2.2.1 泛型和泛型擦除 2.2.2 自动装箱.自动拆箱.遍历循环 2.2.3 条件编译 三.运行时优化(核心: ...
- 满满的一整篇,全是 JVM 核心知识点!
头图 | CSDN 下载自视觉中国 作者 | sowhat1412 责编 | 张文 来源 | sowhat1412(ID:sowhat9094) 想要提高程序员自身的内功心法无非就是数据结构跟算法 ...
- 【随笔】JVM核心:JVM运行和类加载
前言 本篇博客将写一点关于JVM的东西,涉及JVM运行时数据区.类加载的过程.类加载器.ClassLoader.双亲委派机制.自定义类加载器等,这些都是博主自己的一点理解,如果有误,欢迎大家评论拍砖~ ...
最新文章
- uikit框架开发前期配置及定制主题方法。
- 关于“心脏出血”漏洞(heartbleed)的理解
- 计算机科学最重要的32个算法
- 微信系列研究之-----资源文件保护的小把戏
- cloud foundry_Cloud Foundry Java客户端–流事件
- c++运行不出结果_fastjson 不出网利用总结
- HDU 3572 Task Schedule
- android float类型保留两位小数_你知道MySQL中Decimal类型和Float Double的区别吗?
- PDE9 wave equation: general solution
- tamtam-nuget-imageserver
- AndroidOpenCV摄像头预览全屏问题
- 运筹学教学|十分钟快速掌握割平面法及对偶单纯形法(附Java代码及算例)
- 基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-汉字手写轨迹输入
- 2019 秋季最新最全面 JAVA 面试题 附答案
- 想杀死某个端口进程,但在服务列表中却找不到,可以之间通过命令行找到这个进程并杀死该进程,减少重启电脑和找到问题根源。
- Linux系统Centos7的虚拟机安装
- input触发的事件触发流程
- ARGB1555内部存储空间的大小与ARGB转换方式
- fiddler抓包 破解微信投票
- ddos攻击是利用什么进行攻击
热门文章
- 使用JS/Jquery获得父窗口的几个方法(笔记)
- 2022-2028年中国再生金属行业投资分析及前景预测报告
- xgboost lightgbm catboost 多分类 多标签
- python编程问题--第二次
- TVM交叉编译和远程RPC
- C++ OP相关注意事项
- CodeGen字段循环Field Loop
- 客快物流大数据项目(八):Docker的安装和启动
- 2021年大数据HBase(十六):HBase的协处理器(Coprocessor)
- 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法