拓冰建站拓冰建站
首页 / 资讯中心 / 正文

JVM基础-元一软件

1-JVM基础java源码文件通过javac 转换成class文件。找到.java文件词法分析器tokens流语法分析器语义分析器字节码生成器转成.class文件装载根据全限定路径名寻找class文件转换成二进制流。**通过ClassLoder.load(String name)类装载器name全限定路径名**不同路径下的类设置不同路径的类装载器。Bootstrap ClassLoader根装载器由C语言编写加载$JAVA_HOME中的jar/lib/rt.jar里所有的class或Xbootclassoath选项指定的jar包Extension ClassLoader加载Java平台中扩展功能的一些jar包包括$JAVA_HOME中jar/lib/*.jar或-Djava.ext.dirs指定目录下的jar包App ClassLoader加载classpath中指定的jar包及Djava.class.path所指定目录下的类和jar包Custom ClassLoader自定义装载器改变装载原则如Tomcat打破双亲委派机制通过java.lang.ClassLoader的子类自定义加载class属于应用程序根据自身需要自定义的ClassLoader如Tomcat、JBoss都会根据j2ee规范自行实现ClassLoader需要把类文件静态存储结构里面对应的内容存储到JVM里面**方法区的运行时数据结构**代码里一段方法不宜过长阿里规范中提到一段方法不应超过80行。方法存到JVM里的栈帧。内容一旦超过一定行数或者过长时JVM就会从编译性改变为解释性从而导致性能下降。java.lang.Class对象存储到堆内存链接验证保证被加载的正确性。验证class文件中的cafe babe。注class文件中已cafe babe为开头的是java文件。准备为类的静态变量分配内存。如private static int a 3;//为a分配内存并且将a初始化默认值默认值a0解析将类中的符号引用转换为直接引用。静态的转换。符号引用就是class文件中的内容符合JVM规范的内容JVM认识的语言。直接引用在Java进程中能够代表真实含义的。JVM更底层计算机能够认识的语言并且操作的。比方说为某个静态变量分配了真实的内存。初始化对类的静态变量进行正真的初始化。就是将上一步中的准备过程中的private static int a 3;//为a分配内存并且将a初始化默认值默认值a0。将3正真的赋值 a 3。JVM运行时划分的区域程序最小单位是进程数据不安全进程内的数据会被该进程内所有的线程共享进程包含多个线程。线程是进程最小的执行单位。栈只要符合栈结构都遵循先进后出的原则**方法区 Method Area进程、非堆**类信息【类的创建时间、作者、元数据数据描述信息】、常量【final】、静态变量【static】、即时编译器编译后的代码。里面存储的是一些。类类型加载的东西也就是反射中的.class之后的Class用于存储已经被虚拟机加载的类的信息、常量、静态变量等。与堆一样是被线程共享的内存区域要注意线程安全问题。方法区逻辑上属于堆的一部分。如果存储数据大小超过了比方说1个G就会报OutOfMemoryErrorOOM异常。**堆 Heap进程**代表某个类的java.lang.Class对象。存储对象、String、数组。如果存储数据大小超过了比方说1个G就会报OutOfMemoryErrorOOM异常。**Java虚拟机栈线程**一个线程当中会有一个私有Java虚拟机栈。生命周期是与线程绑定在一起。存储Java方法。在Java方法中如何去调用C语言的方法通过动态链接去调用完成。**本地方法栈线程**存储C语言方法。**栈帧Java虚拟机栈、本地方法栈Frame**代表是方法的执行。一个栈帧被创建就表示一个方法被执行方法压栈先进后出。//伪代码1a(){b();}b(){c();}c(){}//先进行压栈 //先往Java虚拟机中压栈存入a()之后是b(),在之后是c()。 //之后是出栈 //在c()方法执行完之后先出b()执行完再出最后是a()执行完再出。 //先进后出的概念。 //伪代码2a(){a();}//如果递归一直调用自己超出栈的长度或深度就会报StackOverflowError栈溢出。同理如果一个方法内部的调用链非常长或深的话也一样会报StackOverflowError栈溢出。**局部变量表**存储方法中的局部变量**操作数栈**栈结构用来描述运算过程当中数据暂时的存储位置//伪代码.java文件 public static int calc(int op1,int op2){op13;int resultop1 op2;returnresult;}//.java文件的.class文件翻译的JVM字节码。 public static int calc(int op1,int op2);Code:0:iconst_3 // 将3放到操作数栈中 //局部变量下标如果是类级别方法【static修饰的方法】下标是从0开始如果是实例方法下标从1开始0标识的是这个实例保留给当前对象的引用this。1:istore_0 //将操作数占中的3赋值给局部变量表中的局部变量2:iload_0 //将局部变量0值放到操作数栈中3:iload_1 //4:iadd5:istore_26:iload_27:ireturn动态链接符号引用转换为直接引用**。动态的转换。比方说一个方法调用某个接口或抽象类这时是不知道这个方法内部具体实现的只有等到程序运行时才能知道具体是调用了哪个子类或实现类的方法。正常或异常方法的返回**程序计数器线程**是一块较小的内存空间它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里仅是概念模型各种虚拟机可能会通过一些更高效的方式去实现字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。JAVA 对象内存布局对象头Mark Word一系列的标记为哈希码分代年龄锁状态标志等64位系统8字节Class Pointer指向对象对应的类元数据的内存地址 64位系统8字节Length数组对象特有数组长度 4字节实例数据包含了对象的所有成员变量大小由各个变量类型决定boolean和byte1字节short和char2字节int和float4字节long和double8字节reference8字节64位系统
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门