来源《java性能优化实践》
/**
* Java 性能优化 2
* JVM 概述
* @解释和类加载
* 基于栈的解释性机器
* 没有寄存器——通过使用一个包含部分结果的栈,执行栈顶的一个或多个值完成计算
* java解释器——包含在while中的switch语句 (switch-inside-while)
* 当使用java 执行应用程序时,操作系统会启动java虚拟机进程,该进程会设置java虚拟环境 并初始化这一栈式机器,
* 这一机器真正执行应用程序中的类文件用户代码
* 程序的入口是main,虚拟机执行前必须加载这个类,然后才能将控制权交给
* 实现这一点需要java的类加载机制,当启动一个程序时,会使用一个加载器链
* 初始的加载器就是所谓的启动类加载器(bootstrap,classloader),它包含核心java运行时中所需的类
* 启动类加载器的要点是获得一个类运行时最小集合,以允许其他类加载启动系统的其他部分
* 这里注意类加载器顺序,避免循环
*
* 扩展类加载器
* 负责从指定的类路径中加载用户类,当程序在执行的过程中遇到对新的类产生依赖时,java就会加载他们
* 如果一个类加载器没有找到某个类,则加载行为将被委托其父加载器,如果链式查找已经到了启动类加载器,还是没有找到。则抛出异常
* 正常情况类只会被加载一次,并在运行时环境创建一个Class对象来表示,但是同一个类可能被不同的类加载器加载两次
* 类在系统中通过加载它的类加载器名称以及全限定类名表示
*
* @执行字节码
* java源代码在执行之前需要经历一系列的变换,
* javac进行源代码编译阶段,通常作为更上层构建流程的一部分调用
* 将.java文件转换为.class文件
* 对源代码做了非常直接的变换,很少在编译期间进行优化
* 字节码是一种中间表示没有底层机器进行绑定。
* 和机器架构的好处
* 提供了可移植,这意味着已经开发好或者编译完的软件可以在JVM支持的任何平台上运行
* 提供了对java语言的抽象
* 现在JVM和java语言在一定程度上是独立
* 因为JVM可以执行任何能生成合法类文件的JVM语言。
* 不管使用的是何种代码编译器,生成的类文件都具备虚拟机规范所制定的结构。
* JVM对于任何要加载的类,都要先验证他们符合指定格式,然后才允许其执行。
*
* @类文件解释
* 魔数
* 前四位十六进制 = 符合类文件形式
* 后四位十六进制 = 主版本和此版本号
* 检查这些自己取保JVM的版本不低于编译该类版本
* 类加载检查版本号确保兼容-如果不兼容则不支持异常
* 类文件格式版本
* 主版本和次版本
* 常量池
* 保存代码中常量,类,接口和字段的名字
* 当JVM执行代码时,会使用常量池来查找值而不依赖于运行时的内存布局
* 访问标志
* 用于确定应用于该类的修饰符
* 标志的对部分判断是否public
* 随后部分判断是否final 这个标志还能判断是接口还是抽象类
* 最后的标志标识这个类文件是标识源代码中没有出现的合成类,注解类型,枚举
* 当前类
* 超类
* 接口
* 都是指向常量池的索引,用于识别该类相关的类型层次
* 字段
* 方法
* 定义了一个类似签名的结构,包括应用于字段或方法的修饰符
* 属性
* 使用一组属性,用于标识更复杂,大小不固定的结构中的结构化条目
*/