JVM学习笔记之常见JVM机制

开发 后端
这里向大家描述一下JVM学习笔记中各种机制,主要包括Java源码编译机制,类加载机制和类执行机制等内容,希望对你的学习有所帮助。

JVM有很多值得学习的地方,这里就和大家一起来看一下它都包含哪些机制,常用的有Java源码编译机制,类加载机制和类执行机制几种,这里详细介绍一下。

JVM学习笔记之JVM机制

一、JVM学习笔记之Java源码编译机制:

1。分析和输入到符号表(ParserAndEnter):

词法分析com.sun.tools.javac.parser.Scanner:将代码字符串转变为token序列。

语法分析com.sun.tools.javac.parser.Parser:Token序列生成抽象语法树。

输入到符号表com.sun.tools.javac.comp.Enter:类中出现的符号输入类自身的符号表中等。

2。注释处理(AnnotationProcessing)

用于处理用户自定义的annotation,处理后再次进入ParserAndEnter步骤。

3。语法分析和生成class文件(AnalyseandGenerate)

基于抽象语法树进行一序列语义分析,再完成分析后,开始生成class文件com.sun.tools.javac.jvm.Gen。

二、JVM学习笔记之类加载机制(类加载器子系统的工作职责与工作流程):

1。装载(Load):查找并装载二进制字节码,采用两个元素来标识一个被加载的类:类的全限定名+ClassLoader实例ID。

2。链接(Link):校验(Verify)--格式校验确保被导入类的正确性-->准备(Prepared)--为类变量分配内存空间并初始化默认值-->解析(Resolve)--把导入类的符号引用转换为直接引用。

3。初始化(Initialize):执行类中的静态初始化代码、构造器代码及静态属性的初始化。

ClassLoader双亲委派模型:

BootstrapClassLoader--$JAVA_HOME/jre/lib/rt.jar(曾祖父)<--

ExtensionClassLoader--$JAVA_HOME/jre/lib/ext/*.jar(祖父)<--

SystemClassLoader--$CLASSPATH(父亲)<--

User-DefinedClassLoader

三、JVM学习笔记之类执行机制:

SunJDK基于栈的体系结构来执行字节码,代码紧凑,体积小。调用方法invokestatic、invokespecial、invokevirtual、invokeinterface。

1。字节码解释执行

指令解释执行:对于方法的指令解释执行,执行方式为经典冯*诺依曼体系的FDX循环方式,有switching-threading、token-threading、direct-threading、subroutine-threading、inline-threading。

SunJDK主要的优化:

栈顶缓存(top-of-stackcaching):即将本来位于操作栈顶的值直接缓存到寄存器上,这对于大部分只需要一个值的操作而言,无须将数据放入操作数栈,可直接在寄存器计算,然后返回操作数栈。

部分栈帧共享:当方法调用时,后一个方法可将前一方法的操作数作为当前方法的局部变量,从而节省数据copy带来的消耗。下面再来看一下JVM学习笔记之类执行机制的第二部分内容字节码编译执行。

2。字节码编译执行

解释执行的效率较低,为提升代码执行性能,SunJDK提供将字节码编译为机器码的支持,编译在运行时进行,通常称为JIT编译器。SunJDK在执行过程中,对执行频率不频繁的代码采用解释执行,执行频率高的代码采用编译执行。

SunJDK主要的优化:

ClientCompiler(C1):

方法内联:-XX:MaxInlineSize=字节数进行控制。

去虚拟化:进行类的层次的分析,如发现类中的方法只提供一个实现类,那么可以对调用此方法的代码进行方法内联。

多余消除:根据运行状况进行代码折叠或消除。

ServerCompiler(C2):

标量替换:用标量替换聚合量,如:用基本类型替换对象。

栈上分配(TLAB):对于未逃逸对象可以直接在栈上分配,而不是JVM堆上。

同步消除:如果发现同步对象未逃逸,可以去掉同步。

SunJDK之所以未在启动时即编译成机器码,有几方面原因:

根据运行状况来进行动态编译,为C2收集运行数据的越长的时间,编译出来的代码会比静态编译更优越。

解释执行比编译执行更节省内存。

启动时解释执行的启动速度比编译再启动执行更快。

(小记:当java-server出现Error:no`server'JVMat`XXX\bin\server\jvm.dll'错误时,解决方法可以复制jdk下jre\bin\server目录到jre7\bin目录下;或windows下可以通过修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\JavaRuntimeEnvironment;UNIX下更改/usr/java的链接)

3。反射执行

基于反射可动态调用某对象实例中对应的方法、访问查看对象的数据等。最直接的方法是动态生成字节码:Class.forName(Class'sName)。

getMethod相对比较耗性能(装载Class对象、各种(权限等)校验Class、执行构造对象的netInstance、所有方法的扫描及Method对象的复制、......),反射执行获取的方法与标准的方法调用没有任何区别(method.invoke仅比直接调用低一点),所以可采用缓存getMethod返回的Method对象来提升性能。

【编辑推荐】

  1. 调用tomcat设置JVM参数
  2. JVM安装与Tomcat配置具体步骤
  3. 巧解Tomcat中JVM内存溢出问题
  4. JVM学习笔记 JVM内存管理和JVM垃圾回收机制
  5. 揭露JDK,JRE,JVM三者不为人知的隐情
责任编辑:佚名 来源: blog.csdn.net
相关推荐

2022-05-19 07:09:29

机制沙箱安全JVM

2010-09-26 14:01:10

JVM Log

2010-09-26 16:42:04

JVM内存组成JVM垃圾回收

2010-09-27 08:38:49

JVM堆JVM栈

2020-05-26 18:50:46

JVMAttachJava

2023-08-02 08:38:27

JVM加载机制

2023-10-31 16:00:51

类加载机制Java

2021-02-28 11:58:33

JVM机制语言

2021-05-25 09:56:42

Jvm类加载机制Java

2021-09-24 08:10:40

Java 语言 Java 基础

2020-07-21 14:19:18

JVM编程语言

2020-04-15 21:43:22

JVMJavaVMware

2010-09-17 17:18:35

EclipseJVM

2010-09-26 13:23:13

JVM内存管理机制

2010-09-25 15:33:19

JVM垃圾回收

2010-09-26 09:16:16

JVM监控工具

2011-03-11 09:41:17

JavaGC

2022-06-10 07:13:29

JVM垃圾回收

2011-07-05 10:39:55

JVM

2011-11-28 12:31:20

JavaJVM
点赞
收藏

51CTO技术栈公众号