JVM
文章平均质量分 83
Java Virtual Machine
zhangyu丶
这个作者很懒,什么都没留下…
展开
-
JVM一:类加载器
读取 .class 文件,将其转化为某种静态数据结构存储在方法区,并在堆内存中生成一个 java.lang.Class 对象。这个阶段可以是在初始化环节之后进行,实现所谓的“后期绑定”将类变量(静态变量、实例变量)初始化为指定的值(如果指定的话),并执行静态代码块,主动权由 JVM 转移到应用程序,触发初始化有以下场景:第五阶段:卸载命令思考javac 编译过程中已经进行了一次校验怎么在 jvm 还要再进行一次1)防止出现 .class 文件本身就是非法的,采用了不规范的编译器,或者恶意修改了原创 2022-06-29 16:18:11 · 193 阅读 · 1 评论 -
JVM二:类加载器和双亲委派模型
根据 JVM 规范分为启动类加载器(Bootstrap ClassLoader)和非启动类加载器。类加载器的命名空间:每个类加载器都有属于自己的命名空间,一个限定名类理论上只会被一个类加载器加载。通过以下代码验证,同一个限定名类被不同类加载器加载后,被 JVM 认为这是两个完全不一样的 Class 加载字节码文件 将给定的字节数组转化为 Class 实例会先验证是否已经被加载过,如果没有加载过则会先去找父加载器进行加载,如果父加载器无法加载则由当前 进行加载。在向上寻找加载器的过程中,当发现获原创 2022-07-04 18:05:53 · 189 阅读 · 0 评论 -
JVM三:内存分区之线程私有区
Java 文件编译为 Class 文件,这时类加载器对 Class 文件进行加载,将其转化为某种静态数据结构存储到方法区,并在堆内存中生成 对象,之后便交由执行引擎来进行操作(将字节码命令转化为机器语言来执行)。编译期生成(可通过 反编译 Class 文件查看 LocalVariableTable),此时局部变量表的大小已经确定,所以在运行时也不会发生改变,主要用来存储方法的信息(参数、局部变量、基本数据类型、对象的引用地址、返回值地址)。局部变量表是一个字节数组,byte、short、char、boo原创 2022-07-07 15:53:42 · 783 阅读 · 0 评论 -
JVM四:内存分区之线程共享区—方法区
Java 虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于 HotSpot JVM 而言,方法区还有一个别名叫做 Non-Heap(非堆),目的就是要和堆分开。因此、可以把方法区看作独立于堆的内存空间JVM 规范中的一个抽象概念,属于线程共享区域,其内存大小可固定也可动态配置(具体指令取决于方法区在不同虚拟机下不同版本的实现),主要用来存储 Class 的静态数据结构,也就意味着当加载过多的类时,会造成异常。原创 2023-02-08 10:44:09 · 523 阅读 · 0 评论 -
JVM五:内存分区之线程共享区—堆
Java 虚拟机规范》中对堆的描述为:所有对象实例以及数组都应当在运行时分配在堆上。《Java 虚拟机规范》规定:堆可以处于物理上不连续的内存空间中,但在逻辑上它应该是被视为连续的。其大小是可以调节的。所有的线程共享 Java 堆内存,也可以在内划分线程私有的缓冲区(Thread Local Allocaltion Buffer,TLAB)方法结束后、堆中的对象不会马上被清理,仅在垃圾回收时才会被清理。堆是垃圾回收的重点区域。原创 2023-04-19 16:46:49 · 647 阅读 · 0 评论 -
使用 javap 反编译字节码(补充 javac)
JDK 自带的一个工具,作为 .class 文件解析器,可通过 javap 命令反编译一个或者多个 .class 文件,输出结果取决于输入参数,默认输出 protected 和 public 限定的类属性和方法。原创 2023-01-04 13:55:45 · 161 阅读 · 0 评论