Java虚拟机——JVM

1.什么是JVM?

Jvm就是Java虚拟机。抽象在操作系统之上,将字节码文件转成机器码,来屏蔽操作系统的差异。

2.初步认识JVM

我们先来初步认识一下JVM。这是一个最基础的框架,首先我们编译.java的文件,然后通过Java的编译器将其转成.class文件,之后就会通过类加载器将我们编写的类放入运行时数据区。

3. 类加载器(Class Loader)

类加载器的作用就是动态加载类的字节码到JVM中。我们这里主要介绍一下双亲委派机制。

一句话介绍双亲委派机制就是:"先让爸爸加载,爸爸加载不了,儿子再上"。

假设当前是 自定义类加载器(CustomClassLoader) 要加载 java.util.ArrayList:

  1. CustomClassLoader 不立刻加载,而是先问自己的 父加载器(AppClassLoader);

  2. AppClassLoader 也不加载,继续问 父加载器(ExtClassLoader);

  3. ExtClassLoader 继续问 父加载器(BootstrapClassLoader);

  4. BootstrapClassLoader 是顶层加载器,它尝试加载;

    • 如果找到 java.util.ArrayList,就加载并返回;

    • 如果找不到,才逐级向下返回,由子加载器尝试加载。

4.本地方法栈

凡是带了Native关键字的说明:Java的作用范围达不到了,需要调用底层的其他库。

复制代码
public class System {
    public static native long currentTimeMillis();
}

native 方法是用 JNI 把 Java 声明嫁接到本地代码,突破 JVM 限制,访问 OS/硬件功能,但牺牲了平台移植性。

5.程序计数器

每个线程都有一个程序计数器。程序计数器就是当前线程所执行的字节码的"行号指示器",告诉 JVM 下一条该跑哪行。

6.方法区

方法区就是 JVM 的"类图书馆",所有线程共享,存类信息、常量、静态变量,JDK 8 以后用"元空间"实现并移到本地内存。

方法区就像"班级公告栏":所有同学(线程)都能看,贴的是课程表(类结构)、公共值日表(静态变量)、名言警句(常量池)。公告栏从教室黑板(永久代)搬到学校大厅(元空间)后,地方更大,不再挤占教室空间。

静态变量,常量,类信息,运行时的常量池存储在方法区中,但是实列变量存储在堆内存中,与方法区无关。

7.栈

栈:主管程序的运行,声明周期和线程同步,线程结束,栈内存就释放。存储8大基本类型+对象引用+实例的方法。

Java 虚拟机栈是线程私有的方法调用栈,以栈帧为单位存储局部变量与执行现场,方法调用压栈、返回出栈,深度溢出抛 StackOverflowError,无法扩展新栈时抛 OutOfMemoryError。

8.堆

Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的。

类加载器读取了类文件后,一般会把什么东西放入堆内存中?

类,方法,常量,变量,保存我们所有引用类型的真实对象;

堆内存中还要细分为三个区域:

  • 新生区 Young/New
  • 养老区 old
  • 永久区 Perm

GC垃圾回收,主要是在伊甸园区和养老区。假设堆内存不够,OOM错误,JDK8以后,永久区改了个名字,元空间.

9.总结

相关推荐
2601_9687931415 分钟前
Python Requests 轻量自动化:无需浏览器,实现真人级账号浏览模拟
开发语言·python·自动化
eggwyw37 分钟前
关于C++为什么不加入垃圾回收机制解析
开发语言·c++
独泪了无痕10 小时前
探索Pinyin4j-Java中的拼音转换利器
java·后端
道尔柯南11 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
来让爷抱一个12 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
kingx312 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
DevOpenClub14 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
心祭丫丫14 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
露天赏雪15 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力15 小时前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python