java面试题jvm字节码的加载与卸载】的更多相关文章

虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换分析和初始化,最终形成可以被虚拟节直接使用的JAVA类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存到卸载出内存的生命周期包括:加载->连接(验证->准备->解析)->初始化->使用->卸载 初始化的5种情况: 1.使用new关键字实例化对象时,读取或设置一个类的静态字段,除被final修饰经编译结果放在常量池的静态字段,调用类的静态方法时. 2.使用java.lang.reflect包方法对…
ClassLoader类加载器 常见的类加载器有BootStrapClassLoader<-ExtClassLoader<-AppClassLoader<-用户ClassLoader BootStrapClassLoader:加载Java自带的核心类: ExtClassLoader加载在/jre/lib/ext目录下的jar包,同样用户可以将jar放在该目录下. AppClassLoader 加载classpath下面的内容, 加载过程: 读取文件并加载,首先申请父类的加载器进行加载,如…
这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎会好些,所以这篇改成详解字节码. 由于Java纯面向对象的特性,字节码只要能表示一个类的信息,就可以表示整个Java程序了,JVM只要能加载一个类的信息,就能加载整个程序了.所以,不管是字节码,还是JVM加载机制,关注点都是在类.我关注的点主要在于: 1. 由于字节码不是一次性全部加载进入内存,那么…
之前看了一篇关于"Java finally语句到底是在return之前还是之后执行?"这样的博客,看到兴致处,突然博客里的一个测试用例让我产生了疑惑. 测试用例如下: public class FinallyTest { public static void main(String[] args) { System.out.println(getMap().get("key")); } public static Map<String,String> g…
JVM 字节码指令手册 - 查看 Java 字节码 jdk 进行的编译生成的 .class 是 16 进制数据文件,不利于学习分析.通过下命令 javap -c Demo.class > Demo.txt 或者其他方式可反汇编,得到字节码文件 一.JVM 指令分类 (1)操作数栈 过程 符号 变量到操作数栈 iload, iload_, lload, lload_, fload, fload_, dload, dload_, aload, aload_ 操作数栈到变量 istore, istor…
原文地址:http://yhjhappy234.blog.163.com/blog/static/3163283220122204355694/ 前面我们不止一次的提到,Java是一种跨平台的语言,为什么可以跨平台,因为我们编译的结果是中间代码—字节码,而不是机器码,那字节码在整个Java平台扮演着什么样的角色的呢?JDK1.2之前对应的结构图如下所示: 从JDK1.2开始,迫于Java运行始终笔C++慢的压力,JVM的结构也慢慢发生了一些变化,JVM在某些场景下可以操作一定的硬件平台,一些核心…
前言 最近在看<Java 虚拟机规范>和<深入理解JVM虚拟机>,对于字节码的执行有了进一步的了解.字节码就像是汇编语言,是 JVM 的指令集.下面我们先对 JVM 执行引擎做一下简单介绍,然后根据实例分析 JVM 字节码的执行过程.包括: for 循环字节码分析 try-catch-finally 字节码分析 运行时栈帧结构 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素.栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地…
JVM 字节码(四)静态方法.构造代码.this 以及 synchronized 关键字 一.静态代码 public class ByteCodeStatic { private static final String DEFAULT_VALUE = "default_value"; private static String str = DEFAULT_VALUE; static { System.out.println("hello"); } } 编译后查看对应…
JVM 字节码(二)方法表和属性表 上一节中对 ClassFile 的整体进行了五个详细的说明, 本节围绕 ClassFile 最重要的一个内容 - 方法表的 Code 属性展开 ,更多 JVM Methods 规范(Oracle) 一.方法表结构 1.1 方法表结构 方法表的结构如下: method_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info at…
JVM字节码执行引擎 运行时栈帧结构 局部变量表 操作数栈 动态连接 方法返回地址 附加信息 方法调用 解析 分派 –“重载”和“重写”的实现 静态分派 动态分派 单分派和多分派 JVM动态分派的实现 基于栈的字节码解释执行引擎 基于栈的指令集与基于寄存器的指令集 JVM字节码执行引擎 虚拟机是相对于“物理机”而言的,这两种机器都有代码执行能力,其区别主要是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机的执行引擎是自己实现的.因此程序员可以自行制定指令集和执行引擎的…
字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 应用场景:某一天系统出现OOM,通过工具分析,是莫各类的对象占用了很大空间,但是这个对象被许多程序访问,那么就很难找到,工程的全文匹配也只能找到自己的业务代码调用的地方,深入的反射,三方包调用无法匹配.这个时候AOP就可以帮助完成. 两种实…
执行引擎是Java虚拟机的核心组成部分之一. 首先,想想C++和Java在编译和运行时到底有啥不一样? 下图左边,C++发布的就是机器指令, 而下图右边Java发布的是字节码,字节码在运行时通过JVM的类加载器,加载到JVM的虚拟内存的方法区, 再通过编译器.解释器做一次转换生成机器指令.执行引擎正是执行了这样的过程:输入的是内存中的字节码,处理过程是字节码解析的 等效过程,输出的是执行结果. 其次,再来看下图,JVM的内存结构: 一.执行方法. 每个线程在创建后,都会产生一个程序计数器(pc)…
Java 重写(Override)与重载(Overload) 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 重载(Overload) 重载(overloading) 是在一个类里面,方法名字相同,而参数不同.返回类型可以相同也可以不同. 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表. 方法的重写…
JVM 字节码(三)异常在字节码中的处理(catch 和 throws) 在 ClassFile 中到底是如何处理异常的呢? 一.代码块异常 catch catch 中的异常代码块在异常是如何处理的呢?还记得在 Code 属性中有如下的结构吗?这代码的是一个异常表信息. Code_attribute { ... u2 exception_table_length; { u2 start_pc; u2 end_pc; u2 handler_pc; u2 catch_type; } exceptio…
JVM 字节码(一)字节码规范 JVM 学习资源 Java ClassFile 字节码规范(Oracle) Java 虚拟机规范(Java SE 7 中文版) (周志明等译) Java 反编译工具 - jclasslib(比 javap -v 信息更详细,可以在 IDEA 插件中直接下载) winhex 一款十六进制查看工具 下面以一个小例子讲解一下 ClassFile 的文件结构(JDK 8 编译) public class ByteCodeTest { private int m; priv…
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习字节码执行引擎? 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步 首先,抛出灵魂三问: 虚拟机在执行代码的时候,如何找到正确的方法呢? 如何执行方法内的字节码呢? 执行代码时涉及的内存结构有哪些呢? 如果你对上述问题理解得还不是特别透彻的话,可以看下这篇文章:如果理解了,你可以关闭网页,打开游戏放松了hhh 下面,笔者将带你探究 J…
本文转载自JVM 字节码之 int 入栈指令(iconst.bipush.sipush.ldc) 前言 本文介绍 int 入栈指令 iconst.bipush.sipubh.Idc. 当 int 取值 -1~5 采用 iconst 指令,取值 -128~127 采用 bipush 指令,取值 -32768~32767 采用 sipush 指令,取值 -2147483648~2147483647 采用 ldc 指令. iconst 当 int 取值 -1~5 时,JVM 采用 iconst 指令将…
idea字节码插件JClassLib--阅读JVM字节码 生成字节码文件并查看 查看字节码文件的方式:javac 文件名.java 即可生成.class文件,但是这种方式不方便 java:是运行字节码文件:由java虚拟机对字节码进行解释和运行. javac:是编译命令,将java源文件编译成.class字节码文件. javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码. package demo; public class HelloWorld { p…
1. 场景的产生 先来看下下面代码展示的两个场景 @Testvoid testIPP() { int i = 0; for (int j = 0; j < 10; j++) { i = i++; System.out.println(i); }}@Testvoid testPPI() { int i = 0; for (int j = 0; j < 10; j++) { i = ++i; System.out.println(i); }} 首先两个方法的开始都定义了一个int变量 i,并初始化…
作者: LemonNan 原文地址: https://juejin.im/post/6885658003811827725 代码地址: https://github.com/LemonLmNan/ByteCode 字节码 概述 本篇要介绍的是能 "一次编译,到处运行的 JVM 字节码" 为什么能到处运行? 是因为在 任意平台下所编译出来的 class文件都遵循相同的字节码规范, 运行期间 不同平台的 JVM 解析相同的 class文件 能解析出特定于该平台的机器码以供使用. 本文大致介…
一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责JAVA_HOME/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. 2.其他类加载器:由java实现,可以在方法区找到其Class对象.这里又细分为几个加载器 a).扩展类加载器(Extension ClassLoader):负责用于加载JAVA_HOM…
简介: 类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的. Java Applet 需要从远程下载 Java 类文件到浏览器中并执行. 现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用. 1,java.lang.ClassLoader类介绍 1,java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class类…
类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性. 1.类加载机制 我们来了解一下虚拟机如何加载Class文件. 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被直接使用的java类型,这就是虚拟机的类加载机制. 类的生命周期包括加载(Loading).验证(Verification).准…
今天遇到一个问题:在cmd命令行中,用javac编译java文件可以成功,但是用java执行却提示“找不到或无法加载主类”.现将该问题的原因以及解决办法记录一下. 先理解一下系统变量path和classpath的作用. path:可执行命令的搜索路径,在该路径下搜索可以运行的程序或批处理文件. 命令行中输入一个命令,则会在path配置的目录中查找该命令,如果存在则调用该程序运行,如果不存在则提示“ 'XXX' 不是内部或外部命令,也不是可运行的程序或批处理文件.” 如果要想在cmd中执行java…
最近在补<thinking in java>...有一节提到了加载类需要做的一些准备...我照着书本敲了一下代码...同时稍微修改了一下书本上的代码.... package charpter14; import java.util.Random; class Initable{ static{ System.out.println("haha"); } static final int staticFinal = 47; static final int staticFin…
  正确编译命令: javac Hello.java 正确运行命令: java Hello   错误1:H:\code>java Hello.java 错误: 找不到或无法加载主类 Hello.java 原因:命令错误   错误2:H:\code>java Hello.class 错误: 找不到或无法加载主类 Hello.class 原因:命令错误   错误3:java 源文件带有包名,往往容易出错 解决:删除包名  或者  创建一个与包名相同的文件结构(H:\code\com\example…
这边提供一个关于程序中含有package关键字,使用“终端”运行程序时出现“找不到或无法加载主类”,而使用Eclipse软件可以正常运行程序的可能解决办法. 例如程序名为HelloWorldTest.java,程序中含有package helloWorld语句,而该包位于javatest目录下,即javatest/helloWorld/HelloWorldTest.java. 应该在java文件所在的目录运行javac指令,即在helloWorld目录中运行javac HelloWorldTes…
Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 演示 我们以具体的代码来演示什么是动态加载类和静态加载类: 新建:Office.java: class Office { public static void main(String[] args) { // new 创建对象,是静态加载类,在编译时刻就需…
Qt中如何 编写插件 加载插件 卸载插件是本文要介绍的内容.Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件系统,就使用了Qt的这套类库. 一 编写插件 编写一个Qt的插件需要以下步骤 1.声明一个插件类, 2.定义一个类,实现这个插件类定义的接口,定义的这个类必须从QObject集成下来. 3.使用Q_INTERFACESQ_INTERFACE…
在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载.在C#中我们也能使用Assembly.LoadFile实现动态加载DLL,但是当你试图卸载时,你会很惊讶的发现Assembly没有提供任何卸载的方法.这是由于托管代码的自动垃圾回收机制会做这件事情,所以C#不提供释放资源的函数,一切由垃圾回收来做. 这引发了一个问题,用Assembly加载的DLL可能只在程序结束的时候才会被释放,这也意味着在程序运行期间…