JVM的内存模型和.Net CLR的内存模型有很多相似的地方。《.Net CLR 内存模型小结》
1 类加载器(ClassLoader)
1.1 Class Loader 的分类
- 启动类加载器(BootStrap Class Loader):加载 rt.java (Java基础类库)。
- 扩展类加载器(Extension Class Loader):加载扩展功能 jar 包。
- 系统类加载器(System Class Loader):即 AppClassLoader。加载启动参数 classpath 中的 jar 包,包括用户自己写的类。
- 用户自定义类加载器(User Defined Class Loader):供用户自己手动控制加载过程。
1.2 Class Loader 的工作过程
1.2.1 装载
- 装载 .class 文件。
- 双亲委派模型(Parent Delegation Model)。Parent Class Loader 无法加载时再由自己加载类。保证安全加载,防止恶意冒充核心包。
1.2.2 链接
- 校验 .class 文件是否符合规范,是否符合当前 JVM。
- 把类型信息合并到 JVM 运行时中(方法区)。
- 为类分配内存(如,类的静态字段)。
1.2.3 初始化
- 只有类第一次被访问到,才会做初始化。
- 初始化静态变量,执行静态代码,静态构造函数。
2 运行时数据区(Runtime Data Area)
2.1 方法区(Method Area)(线程共享)
- 存储类型信息。SUN JDK 中对应 持久代(Permanent Generation)。
- 为加快速度,通常为每个非抽象类创建私有方法表。利于多态的实现。
2.2 堆(Heap)(线程共享)
2.2.1 新生代区(Yong Area)
- 存放新生的对象;频繁收集。
- 1个 Eden Space:
- 新创建的对象进入 Eden Space。
- Eden Space 中的 Thread Local Allocation Buffer (TLAB)
- 默认占 Eden Space 的 1%,线程私有。
- 为提高效率,针对不存在线程共享,同时适合被快速GC的小对象,会优先被分配到 TLAB。
- 2个相同大小的 Survivor Space:
- 用于 Minor GC 时的对象复制。主要目的是用空间换时间,从而提高 GC 的速度。
2.2.2 老年代区(Old Area)
存放生命周期较长的对象;较少收集。
2.2.3 GC 原理(类似 .Net CLR 中的 GC)
GC 监控对象地址、大小、使用情况等,(用有向图)记录和管理堆中的对象,以确定哪些对象可达,哪些对象不可达。当对象不可达时,GC有责任回收其内存空间。程序员可以主动调用 System.gc(),通知GC运行,但Java语言规范不保证GC一定会执行。
2.2.4 两种 GC 模式
- GC (Minor GC):收集 Yong Area。
- Full GC (Major GC):收集 Yong + Old
2.2.5 并不是所有的对象都在堆上分配
- 一种是上述 TLAB 的情况(虽然TLAB属于堆,但它是线程私有的,与一般意义上线程共享的堆不同)。
- 另一种是在线程栈上分配。JVM 在 Server 模式下可开启“逃逸分析”,如果分析出某个对象永远只在某个方法、线程的范围内,这个对象就可以在线程栈上分配。
2.2.6 OutOfMemoryError (OOM)的两种类型
- Java Heap Space:调整参数 -Xms(初始堆大小)和 -Xmx(最大堆大小)
- PermGen Space:调整参数 -XX:PermSize(初始Perm堆大小)和 -XX:MaxPermSize(最大Perm堆大小)
2.3 Java 栈(Java Stack)(线程私有)
- 分为 局部变量区、操作数栈、帧数据区。存储方法参数、局部变量、中间运算结果、提供其它模块(PC Register)所需数据。
- 一个栈帧对应一个方法的调用。调用方法时入栈,方法返回时出栈。
- 局部变量区:以字长为单位(32bit)。byte,short,char 会被转换为 int;long,double 占2个字长(64bit)。
2.4 本地方法栈(Native Method Stack)(线程私有)
类似 Java Stack,针对本地方法。SUN JDK 中就是 Java Stack。
2.5 PC 寄存器(Program Counter Register)(线程私有)
保存线程当前指令所在位置。
3 执行引擎(Execution Engine)
- 包括 解释执行、编译执行、自适应优化执行、硬件芯片执行。
- 编译执行:JIT(Just-In-Time)运行时将字节码编译为机器码,重复利用。
- 自适应优化执行:如HotSpot VM,将热点代码编译为本地代码提高效率,热点消退后又取消这部分编译后的本地代码。
- SUN JDK 编译模式
- Client:轻量级,占用内存少。
- Server:占用内存多。可开启对象“逃逸分析”。
4 本地方法接口(Native Interface)
相关推荐
第104讲 字节码执行引擎小结 00:03:38 第105讲 总结与回顾 00:10:55 第106讲 happens-before简单概述 00:15:17 第107讲 重排序问题 00:23:19 第108讲 锁的内存语义 00:13:54 第109讲 volatile的...
### 小结 本文详细介绍了JVM的基本运行机制、调试参数、垃圾收集算法以及监控和锁的应用等内容。深入理解这些知识点对于高效开发和维护Java应用程序至关重要。通过对JVM的工作原理有一个清晰的认识,开发者可以更好...
视频目录 第1节说在前面的话 [免费观看] 00:05:07分钟 | 第2节整个部分要讲的内容说明 [免费观看] 00:06:58分钟 | 第3节环境搭建以及jdk,...第104节字节码执行引擎小结00:03:38分钟 | 第105节总结与回顾00:10:55分钟
### Java语言基础小结 #### 一、JDK, JRE, JVM的关系 - **JVM(Java Virtual Machine)**:Java虚拟机是Java程序跨平台运行的核心,它负责执行Java字节码(.class文件),确保Java程序可以在不同的平台上运行而...
【RMI(Remote Method Invocation)入门小结】 远程方法调用(RMI)是Java平台上的一个关键特性,它允许Java对象在不同的JVM(Java虚拟机)之间进行通信,从而实现分布式计算。RMI机制使得开发者可以像调用本地方法...
这篇文档将对Java的基础知识进行深入解析,包括语法、类与对象、数据类型、控制结构、异常处理以及常用工具的使用。 首先,Java是一种面向对象的编程语言,它的核心理念是“一次编写,到处运行”。这意味着Java程序...
### Android高级工程师面试技术点小结 在当前竞争激烈的IT行业中,成为一名优秀的Android高级工程师不仅意味着需要具备深厚的技术功底,还需要不断跟进最新的技术趋势和发展方向。本文将根据标题、描述以及部分内容...
- `boolean`:通常认为是1字节,但实际上Java虚拟机(JVM)并未明确规定其大小,但在实践中通常按1字节处理。 #### 二、Cavaj软件:Java反编译工具 Cavaj是一款强大的Java反编译工具,它能够将Java字节码(.class文件...
### JavaSE与JavaEE基础部分小结 #### JavaSE 基础知识点 ##### Java语言特点 1. **跨平台性**:Java的核心优势之一在于它的可移植性,即“一次编写,处处运行”。这意味着Java程序可以在任何安装了Java运行环境...
### Java基础知识小结 #### 1.1 `getPath()`、`getAbsolutePath()`、`getCanonicalPath()`的区别 在Java中,处理文件路径时经常会用到`getPath()`、`getAbsolutePath()`以及`getCanonicalPath()`这三个方法。它们...
首先,我们来看一下Properties类的继承结构。它继承自Hashtable类,这意味着Properties类本质上是一个键值对的集合,且线程不安全。由于继承自Hashtable,它支持同步操作,但在处理大量并发时,建议使用Properties的...
1.7 本章小结 第二部分 自动内存管理机制 第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行...
1.3 小结 第2课 对象与内存控制 2.1 实例变量和类变量 2.1.1 实例变量和类变量的属性 2.1.2 实例变量的初始化时机 2.1.3 类变量的初始化时机 2.2 父类构造器 2.2.1 隐式调用和显式调用 2.2.2 访问子类对象...
- 方法区是JVM的一部分,它存储了类的元数据,如类名、超类、接口、访问修饰符等基本信息。 - 运行时常量池是方法区的一部分,它包含各种常量,如字符串、final变量、类名和方法名,这些常量通过索引进行访问。 -...
1.3 小结 1.4 思考题 第2章 Java对象持久化技术概述 2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 ...
1.3 小结 1.4 思考题 第2章 Java对象持久化技术概述 2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 ...
1.3 小结 1.4 思考题 第2章 Java对象持久化技术概述 2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 ...
1.3 小结 1.4 思考题 第2章 Java对象持久化技术概述 2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 ...