jvm如何加载.class文件
发表于|更新于|JVM
|浏览量:
jvm如何加载.class文件
JVM是一个内存中的虚拟机
- Class Loader:根据特定格式,加载class文件到内存
- Execution Engine:解释器,对命令进行解析
- Native Interface:融合不同语言的原生库为java所用
- Runtime Data Area:JVM内存空间结构模型
由Class Loader加载.class文件到内存,Execution Engine进行解析运行,如果有native方法交给Native interface执行
文章作者: Alfred
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Alfred的小站!
相关推荐

2021-04-11
反射
反射Java反射机制是在运行状态中, 对于任何一个类,都能够知道这个类的所有属性和方法; 对于任何一个对象,都能够任意调用他的方法和属性; 这种动态获取信息和动态调用对象方法的功能就叫做反射机制。

2021-04-11
ClassLoader
ClassLoader类从编译到执行的过程 编译器将源文件转化为字节码文件 ClassLoader将字节码转化为JVM中的Class<T>对象 JVM利用Class<T>对象实例化为T对象 ClassLoaderClassLoader在java中有着非常重要的作用,它主要工作在class装载的加载阶段,其主要作用是从外部系统获得class二进制数据流,它是java的核心组件,所有的class都是由ClassLoader进行加载的,ClassLoader负责通过将class文件里的二进制数据流装进系统,然后交给java虚拟机进行连接、初始化等操作。 ClassLoader的种类 BootStrapClassLoader:C++ 编写,加载核心库java.*(例如java.lang) 通常这些核心类被签名,不能被替换掉 ExtClassLoader:Java编写,加载扩展库javax.* 是用户可见的ClassLoader AppClassLoader:Java编写,加载程序所在目录(class.path) 自定义ClassLoader:Java编写...

2021-04-11
内存模型
内存模型 Runtime Data Aera Method Area:是Java虚拟机规范中的概念,在HotSpot的实现中: JDK7及以前,HotSpot用永久带来实现方法区,存在jvm内存中,与堆连续的地址空间,GC和老年代一起。 JDK8及以后,HotSpot把很多东西放到了堆或者本地内存,而方法区则成为了元空间的实现,同时元空间不再与堆连续,而且是存在于本地内存(Native memory)。 JVM内存模型 线程私有:程序计数器,虚拟机栈,本地方法栈 线程共享:MetaSpace、Java堆 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看做是当前线程所执行的字节码行号的指示器; 字节码解释器工作时,通过改变计数器的值选取下一条执行的字节码指令;(一些基本功能都需要依赖计数器来完成 如 分支 循环 跳转 异常处理 线程恢复 等) 和线程一对一关系,即线程私有。java虚拟机多线程是通过线程间轮流切换来分配给处理器执行时间;在确定时间节点,一个处理器(一核)只会执行一个线程的指令;为保证线程切换回来后能恢复到原执...

2021-04-11
常考题型
JVM三大性能调优参数 -Xms -Xmx -XSS的含义 -Xss:规定了每个线程虚拟机栈(堆栈)的大小 此配置影响并发线程数大小 -Xms:堆的初始值 -Xmx:堆能达到的最大值 Java内存模型中堆和栈的区别——内存分配策略存储方案: 静态存储:编译时确定每个数据目标在运行时的存储空间需求 栈式存储:数据区需求在编译时未知,运行时模块入口前确定 堆式存储:编译或运行时模块入口都无法确定,动态分配。 堆和栈的联系引用对象、数组时,栈里定义变量保存堆中目标的首地址 区别 管理方式:栈自动释放,堆需要GC 空间大小:栈比堆小 碎片相关:栈产生的碎片远小于堆 分配方式:栈支持静态和动态分配,堆只支持动态分配 效率:栈的效率高 元空间、堆、线程独占部分间的联系——内存角度示例如下: 元空间: 保存装载进来的HelloWorld对象的信息及其Method和Field。 额外还有System这个类对象及该类中的成员变量和方法等 堆: 存储HelloWorld类创建出来的对象实例object,以及String实例“test” 线程独占: 当程序执行时,ma...

2021-04-11
GC
GC 垃圾回收机制判断对象是否为垃圾的算法引用计数算法 通过判断对象的引用数量来决定对象是否可回收 每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1 优点:执行效率高,程序执行受影响较小 缺点:无法监测出循环引用的情况,导致内存泄露 由于其缺点的存在,主流JVM基本不使用此方式。 可达性分析算法 通过判断对象的引用链是否可达来就决定对象是否可以被回收 对内存中的整个对象图进行遍历,从GC Root开始,回收器将所有访问到的对象标记为存活,完成遍历后不可达的对象会被作为垃圾对象而清除。 可以作为GC Root的对象 虚拟机栈中引用的对象(栈帧中的本地变量表) 方法区中的常量引用的对象 方法区中的类静态属性引用的对象 本地方法栈中JNI(Native方法)的引用对象 活跃线程的引用对象 垃圾回收算法标记-清除算法(Mark and Sweep)将回收分为两个阶段 标记:使用可达性算法,从根集合进行扫描,对存活的对象进行标记。 清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存。同时将可达标记清除,以便进行下一次回收。 缺点: 碎片化:由于标记清除不...

2021-04-11
常见面试题
常见面试题Object的finalize()方法的作用是否与C++的析构函数作用相同finalize()方法垃圾回收器准备释放内存的时候,会先调用finalize()。 与C++的析构函数不同,析构函数调用确定,而它的是不确定的 当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。 方法执行随时可能被终止 给与对象最后一次重生的机会 对象不一定会被回收。 垃圾回收不是析构函数。 垃圾回收只与内存有关。 垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。 Java中的强引用,软引用,弱引用,虚引用有什么用强引用 最普遍的引用:Object obj = new Object(); 抛出OutOfMemoryEr...




