JVM

JVM

1. JVM的位置

操作系统之上,JRE包含JVM。

2. JVM体系结构

.java -> class file -> 类加载器 Class Loader -> 运行时数据区(方法区 Method Area、Java栈 Stack、本地方法栈 Native Method Stack、堆 Heap、程序计数器) -> 执行引擎/本地方法接口

3. 类加载器

加载Class文件:收到类加载的请求,向上委托,向下加载。

  • 虚拟机自带的加载器

  • 启动类(根)加载器

  • 扩展加载器

  • 应用程序加载器

报错:Class Not Found / null(Java调用不到,C/C++)

4. 双亲委派机制

安全

APP ->EXC ->BOOT(最终执行)

5. 沙箱安全机制

沙箱是一个限制程序运行的环境。引入域的概念,差异化代码执行权限。

基本组成:

  • 字节码校验器:确保Java类文件遵循Java语言规范。

  • 类装载器:采用双亲委派机制。防止恶意代码干涉善意代码;守护被信任的类库边界;将代码归入保护域,确定代码的可运行操作。

    • 存取控制器

    • 安全管理器

    • 安全软件包(安全提供者、消息摘要、数字签名、加密、鉴别)

6. Native

达不到Java的作用范围,会进入本地方法栈,调用本地方法接口JNI(底层C语言的库)。

扩展Java的使用,融合不同编程语言为Java所用。

7. PC寄存器 Program Counter Register

线程私有。指针,指向方法区中的方法字节码。

8. 方法区 Method Area

所有线程共享的公共区间。

静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关。

static final Class 常量池

9. 栈

程序 = 数据结构 + 算法

栈 :一种数据结构。后进先出LIFO(last-in,first-out)。

队列:FIFO(first-in,first-out)。

线程结束,栈内存就释放,不存在垃圾回收。

栈运行原理:栈帧。

实例化过程:分配内存 -> 赋默认值 -> 执行构造方法

10. 三种JVM

  • Sun公司 HotSpot

  • BEA JRockit

  • IBM J9VM

11. 堆 Heap

堆内存大小可调节。

区域:新生区(伊甸园)、养老区、永久区(元空间)。

堆内存不够OOM(OutOfMemoryError:java heap space)。

12. 新生区、老年区

新生区包括伊甸园、幸存区0区、幸存区1区。(幸存区动态调整 from...to...)

13. 永久区

这个区域常驻内存,存放JDK自身携带的Class对象、Interface元数据,也就是存储Java运行时的一些环境或类信息。这个区域不存在垃圾回收。关闭虚拟机就会释放这个区域的内存。

  • jdk1.6之前:永久代,常量池在方法区。

  • jdk1.7:去永久代,常量池在堆中。

  • jdk1.8之后:五永久代,常量池在元空间。

元空间逻辑上存在,物理上不存在。

14. 堆内存调优

处理OOM故障:

  • 内存快照分析工具,MAT、Jprofiler

    • 分析Dump内存文件,快速定位内存泄漏

    • 获得堆中的数据

    • 获得大的对象

  • Debug

-Xms //设置初始化内存分配大小,默认1/64 
-Xmx //设置最大分配内存,默认1/4 
-XX:+PrintGCDetails //打印GC垃圾回收信息 
-XX:+HeapDumpOnOutOfMemoryError //oom DUMP

15. GC:垃圾回收

作用区域:方法区、堆。

大部分时候回收的都是新生代。

分类:

  • 轻GC(普通的GC)

  • 重GC(全局GC)

算法:

  • 标记清除法(优点:不需要额外的空间。缺点:两次扫描严重浪费时间,会产生内部碎片。)

  • 标记压缩(优点:再次扫描,向一端移动存活的对象,防止内存碎片产生。缺点:多了移动成本。)

  • 复制算法(优点:没有内存碎片。缺点:浪费内存空间。适用场景:对象存活度较低,如新生区。)

  • 引用计数器

排序:

  • 内存效率(时间复杂度):复制算法 > 标记清除算法 > 标记压缩算法

  • 内存整齐度:复制算法 = 标记压缩算法 > 标记清除算法

  • 内存利用率:标记压缩算法 > 标记清除算法 > 复制算法

GC分代收集算法:

  • 年轻代:复制算法

  • 老年代:标记清除 + 标记压缩 混合实现

16. JMM (Java Memory Model)

Java内存模型。

缓存一致性协议。保证Java程序在多线程环境下主内存和工作内存结果一致。

核心特性:

  • 原子性 Atomicity

  • 可见性 Visibility

    • 实现方式: volatilesynchronized、final 都能保证可见性。
  • 有序性 Ordering

    • 实现方式: volatile 和 synchronized 可以禁止指令重排序。
posted on 2026-06-28 20:16  神奈酱  阅读(7)  评论(0)    收藏  举报