复习:Class文件结构

Class Loading Linking Initializing:编译 加载 初始化

这节课,我们讲 class 是怎么从硬盘中加载到内存中,并且准备执行的。

package com.mashibing.jvm.c2_classloader;public class T004_ParentAndChild {public static void main(String[] args) {System.out.println(T004_ParentAndChild.class.getClassLoader());System.out.println(T004_ParentAndChild.class.getClassLoader().getClass().getClassLoader());System.out.println(T004_ParentAndChild.class.getClassLoader().getParent());System.out.println(T004_ParentAndChild.class.getClassLoader().getParent().getParent());//System.out.println(T004_ParentAndChild.class.getClassLoader().getParent().getParent().getParent());}
}

输出:

jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc
null
jdk.internal.loader.ClassLoaders$PlatformClassLoader@1e643faf
null

“双亲”这个词不是特别好。实际上是有一个从子到父的过程,也有一个从父到子的过程。
(我理解的这个过程类似于DNS域名解析)是类似于递归的调用。
ClassLoader的Load过程,就是模板方法的设计模式。

手动加载一个类

package com.mashibing.jvm.c2_classloader;public class T005_LoadClassByHand {public static void main(String[] args) throws ClassNotFoundException {Class clazz = T005_LoadClassByHand.class.getClassLoader().loadClass("com.mashibing.jvm.c2_classloader.T002_ClassLoaderLevel");System.out.println(clazz.getName());//利用类加载器加载资源,参考坦克图片的加载//T005_LoadClassByHand.class.getClassLoader().getResourceAsStream("");}
}


可以看一下LoadClass源码:

    protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statsPerfCounter.getParentDelegationTime().addTime(t1 - t0);PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

关于编译器

默认模式是混合模式,就是混合使用解释器加热点代码编译。什么叫热点代码编译?
多次被调用的方法,多次被调用的循环进行编译,怎么检测呢?就是用一个计数器,每个方法上都有一个方法,计数器循环有循环计数器。结果在发现某个方法一秒钟执行了超过某个10万次。我要对他进行编译,拿大腿想一想我该怎么办?直接编译成本地代码,再用的话直接用本地的。不用解释器执行了。

这时候会有人问,为什么不直接都编译成本地代码呢,执行效率更高,因为Java解释器现在效率已经非常高了,在一些简单的代码上它不属于便器。第二点,如果你有一段代码执行文件,特别特别多各种各样的类库,有时候好几十个class,这是正常的。你上来二话不说先给编译器让他编译,编译的过程会长的吓人,所以现在默认的模式是混合模式,但是完全可以用参数来指定到底是什么模式。


这个东西是可以验证的,有一个小程序,可以通过指定不同的参数,看一下编译模式、解释模式、混合模式的执行速度上的差异。
差不多编译模式和混合模式都在4秒左右,解释模式耗时比较长。

package com.mashibing.jvm.c2_classloader;public class T009_WayToRun {public static void main(String[] args) {for(int i=0; i<10_0000; i++)m();long start = System.currentTimeMillis();for(int i=0; i<10_0000; i++) {m();}long end = System.currentTimeMillis();System.out.println(end - start);}public static void m() {for(long i=0; i<10_0000L; i++) {long j = i%3;}}
}

JVM从入门到精通(二):详解Class加载过程,双亲委派机制,编译执行与解释执行相关推荐

  1. JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制

    一 类加载器与类加载过程 类加载子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于 ...

  2. JVM(1)之JVM的组成详解(字符串常量池+双亲委派机制+JIT即时编译......)

    以下总结自:<深入理解java虚拟机> + 宋红康老师视频 字节码文件介绍:深入理解JVM之Java字节码(.class)文件详解_Windy_729的博客-CSDN博客_字节码文件 JV ...

  3. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式

    java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...

  4. 类的加载过程详解:加载、验证、准备、解析、初始化

    想要弄明白的知识点: 类加载的过程,加载.验证.准备.解析.初始化.每个部分详细描述. 加载阶段读入.class文件,class文件时二进制吗,为什么需要使用二进制的方式? 验证过程是防止什么问题?验 ...

  5. 【OpenGL】游戏编程常用TGA图像格式详解以及加载纹理编程实现

    TGA格式图像是游戏中十分常见的一种图像格式,所以有必要了解其内部格式以及编程实现. TGA图像一般有非压缩和压缩两种格式,下面分别进行介绍. 一.非压缩TGA图像 注:前面的标记绿色的部分(共12字 ...

  6. Netty从入门到精通-BIO详解

    导语   随着JavaI/O库的不断迭代升级,基于Java 语言的网络编程也开始变的简单,随着异步I/O功能的增强,基于JavaNIO开发的网络服务器也越来越多.很多的互联网大厂都在不断的优化Java ...

  7. Spring Data JPA 从入门到精通~@Query详解

    语法及其源码 public @interface Query {/*** 指定JPQL的查询语句.(nativeQuery=true的时候,是原生的Sql语句)*/String value() def ...

  8. linux insmod命令参数及用法详解--linux加载模块命令

    insmod(install module) 功能说明:载入模块 install loadable kernel module 语法:insmod [-fkmpsvxX][-o <模块名称> ...

  9. 浏览器渲染阻塞与优化-详解推迟加载、异步加载。

    我认为一个前端工程师是否优秀,很大程度上取决于对前端性能上优化的功力.所以性能优化对前端真的很重要!!! 本文介绍了什么是阻塞.为什么会阻塞?阻塞优化常用的5种方式以及他们的注意事项. 浏览器渲染阻塞 ...

最新文章

  1. 从IoT World 2019看全球IoT九大发展趋势
  2. 关于产品版本英语缩写
  3. Xamarin.Android真机测试提示[INSTALL_FAILED_UPDATE_INCOMPATIBLE]
  4. c语言中if—else的配对问题
  5. Angular7 ng-zorro-antd 制作右键菜单
  6. 处理Matlab Coder之后, Compiler can't find tmwtypes.h问题
  7. 程序基础:数据结构(郝斌讲解)(4)
  8. 使用SAP Cloud Platform Leonardo机器学习的测试控制台
  9. Android Service学习之AIDL, Parcelable和远程服务
  10. C#6.0 十大常用特性
  11. python win32库与subprocess_python subprocess 模块使用(以及详解管道阻塞的坑)
  12. 软件网站安全性的设计与检测与解决方案
  13. 计算机更新bios,小编教你如何升级bios
  14. 使用Flash,HTML5和Unity开发网页游戏的对比
  15. 富士施乐3300打印机驱动安装说明
  16. [CnPeng说]低代码并不Low
  17. Quartus II下载器件库
  18. 服务器pytorch环境配置
  19. Appstore评分数据python实战
  20. 上位机入门之二进制置位

热门文章

  1. java客户端运行hadoop_JAVA客户端连接部署在docker上的hdfs
  2. [uoj24]缩紧优化
  3. Dominant Indices(CF 1009 F)
  4. Team Work(CF 932 E)[bzoj5093][Lydsy1711月赛]图的价值
  5. KdPrint 在checked 和free版本的不同
  6. MAP文件和调试(VC)(从崩溃地址找出错源码位置)
  7. 如何制作出让女朋友满意的大片
  8. 技术人的七夕表白可以有多浪漫?
  9. 干掉 Swagger,试试这个!
  10. 如果我问你:排序算法的「稳定性」有何意义?你怎么回答?