首页 > 基础资料 博客日记

几分钟了解下java虚拟机--01

2025-06-17 01:30:02基础资料围观86

本篇文章分享几分钟了解下java虚拟机--01,对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识

JDK, JRE, JVM的关系

jar包 - > java字节码 - > 机器码

解释执行和即使编译


性能优化


跨平台

  • 解释型语言 - 点名 python (但是python很多点都优化了)

运行时要一直依赖解释器

每次启动重新解释

error不运行不报错

“’. . . ‘”


Runtime

  • JVM (Java Virtual Machine):负责执行字节码的核心引擎。
  • JRE (Java Runtime Environment):提供运行时所需的完整环境,包括 JVM 和标准类库。
  • 运行时数据和状态:如内存分配、线程状态、异常处理等,这些是在程序运行时动态管理的。

因此,"runtime" 是一个抽象概念,而 JVM 是实现这个概念的具体技术实体。


编程语言简评


Java 基本类型

除 long 和 double 外,其他基本类型与引用类型在解释执行的方法栈帧中占用的大小是一致的,但它们在堆中占用的大小确不同。在将 Boolean 、byte 、char 以及 short 的值存入字段或者数组单元时,Java 虚拟机会进行掩码操作。在读取时,Java 虚拟机则会将其扩展为 int 类型


Java编译器

自动装箱与自动拆箱

基本类型 → 对象(int → Integer)

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

可通过调节 java.lang.Integer.IntegerCache.high 调高缓存int的范围
但是不知道为什么没有java.___.low 

泛型与类型擦除

桥接方法

由于泛型擦除 父方法的传入参数发生改变(Object t) 不符合重写规则从而引入了桥接方法

class Parent<T> {
    public void method(T t) {
        System.out.println("Parent");
    }
}

class Child extends Parent<String> {
    @Override
    public void method(String s) {
        System.out.println("Child");
    }
}
**泛型擦除后的父方法**
public void method(Object t) {
    System.out.println("Parent");
}

**java编译器生成的桥接方法**
public void method(Object t) {
    method((String) t);
}
public void method(String s) {
    System.out.println("Child");
}

Java对象的内存布局

// Foo foo = new Foo(); 编译而成的字节码
  0 new Foo
  3 dup
  4 invokespecial Foo()
  7 astore_1
// Foo 类构造器会调用其父类 Object 的构造器
public Foo();
  0 aload_0 [this]
  1 invokespecial java.lang.Object() [8]
  4 return

压缩指针

JAVA字节码

感觉和机器码类似, 不做过多叙述, 偷懒了哈哈🙌


02正在路上了!!!


文章来源:https://www.cnblogs.com/many-bucket/p/18932182
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云