《JVM理论及调优》.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《JVM理论及调优》.doc

JVM理论及调优 Java代码执行机制 Java源码编译机制 Javac编译源码为class文件的步骤 Parse and Enter Parse:词法分析和语法分析,形成抽象语法树; Entrer:包括类的超类和接口、根据需要添加的默认构造器及类中出现的符号输入到类自身的符号表。 Annotaion Processing 将Annotation转化为基础方法,如:@Getter String username转为 String getUsername(); Analyse and Generate Analyse: 基于上两步生成抽象语法树,执行: 将语法树中的名字、表达式等元素和变量、方法和类型关联; 检查变量是否已声明; 推导泛型方法的类型参数; 检查所有语句都可到达; 检查所有checked exception都被捕获或抛出; 将语法糖转为普通语法,如foreach循环、自动装箱/拆箱等; Generate: 将实例成员初始化器收集到构造器 将静态成员初始化器收集为clinit() 将抽象语法树生成字节码 少量代码转化(如String相加转变为StringBuilder操作) 最后从符号表生成class文件。 Class文件的构成: 结构信息:class格式版本号及各部分的数量与大小的信息。 元数据:原数据对应的是java源文件中的声明与常量的信息,主要包括:类/继承的超类/实现的接口声明信息、Field和方法的声明信息和常量池。 方法信息:简单而言就是Java源码中的“语句”和“表达式”对应的信息,主要有:字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试用符号信息。 类加载机制 类装载过程: Load: 装载过程负责找到二进制字节码并加载至JVM中,JVM通过类的全限定名+类加载器(ClassLoader实例)完成类的加载,同样也采用类的全限定名+ClassLoader实例ID来标识一个被加载的类。 对于接口和非数组的类,由所在的ClassLoader负责加载。 数组型类中的元素类型有ClassLoader负责加载,但数组由JVM直接创建。 Link: 负责对二进制的字节码格式校验、初始化装载类中的静态变量及解析类中调用的接口和类。校验过程可能抛出NoClassDefFoundError、NoSuchMethodError、NoSuchMethodError等错误。 Initialize: 四种情况下初始化过程会被触发执行: 调用了new 反射调用了类中的方法 子类调用了初始化 JVM启动过程中指定了初始化类。 JVM类加载通过ClassLoader及其子类来完成。 User-Defined ClassLoader是继承抽象ClassLoader抽象类自行实现的ClassLoader,基于自定义的ClassLoader可用于加载非ClassPath中的jar及目录,如从网络下载的Jar或二进制,还可以在加载之前对class文件做一些动作,如解密。 常见类加载异常: ClassNotFoundException NoClassDefFoundError: public class A { private B b=new B(); }加载A类时,发现B类不存在,报NoClassDefFoundError。 LinkageError:重复加载类造成此异常。 类执行机制 在完成将class文件信息加载到JVM并产生class对象后,就可执行Class对象的静态方法或实例化对象进行调用。在源码编辑外JVM字节码,JVM字节码是一种中间代码的方式,有由JVM在运行期对其进行解释执行,即字节码的解释执行方式。 字节码解释执行 执行指令: InvokeStatic:对应调用static方法; Invokevirtual:对应调用对象实例方法; Invokeinterface:对应调用接口方法; Invokespecial:对应调用private方法和初始化方法。 SunJDK基于栈的方式来执行字节码,基于栈的体系结构 线程创建后,都会产生程序计数器(PC)和栈;PC存放了下一条指令在方法内的偏移量;栈中存放了栈帧,每个方法每次调用都会产生栈帧。局部变量区用户存放方法中的局部变量和参数,操作数栈中存放方法执行过程中产生的中间结果;栈帧中会有一些杂用空间,如用来存放已解析的常量池的引用和VM内部实现需要的一些数据。 编译执行 解释执行通常效率较低,JDK提供了将字节码编译为机器码的的支持,编辑在运行时进行,即JIT编译器。在执行过程中对执行频率高的代码进行编译,对执行不频繁的代码则继续采用解释自行的方式。 Client compiler,又称C1,较轻量级,只做少量性能开销的优化,占用内存较少,适合桌面交互式应用。

文档评论(0)

wgvi + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档