Java安全
Java 基础知识
01概述
02变量
03运算符
04程序控制语句
05数组
06面向对象编程
07代码练习
08重载
09作用域
10构造方法&构造器
11this
12包
13修饰符
14封装
15继承
16super
17覆盖&重写
18多态
19零钱通项目
20类变量&类方法
21抽象类
22接口
23内部类
24枚举
25泛型
26常用API
27lambda表达式
28正则表达式
29异常
30File&IO流
31日志技术
32多线程
33网络编程
01反射
02反序列化
03JVM
04JDBC
05RMI
06JRMP
07JNDI
08CDI
09JPA
10Servlet
11Filter
12MVC模型
13MVC框架
14类的加载机制
15Maven
16注解
17ORM
18CC链
19JNDI注入
Log4j2
-
+
首页
03JVM
 JVM(Java Virtual Machine,Java 虚拟机)是 Java 技术的核心组件,也是理解 Java 安全机制的基础。简单来说,JVM 是一个虚构的计算机(软件实现),它负责执行 Java 字节码(.class 文件),并为 Java 程序提供运行环境。 ## 概述 Java 的口号是 “一次编写,到处运行(Write Once, Run Anywhere)”,而 JVM 正是这一特性的实现基础: - 开发者编写的 Java 代码(.java 文件)会被编译器(javac)编译为**字节码(.class 文件)**,这是一种与平台无关的二进制指令。 - 不同操作系统(Windows、Linux、macOS 等)会安装对应的 JVM 实现(如 HotSpot、OpenJ9 等),JVM 负责将字节码 “翻译” 为当前系统可执行的机器码并执行。 因此,JVM 相当于一个 “中间层”,隔离了 Java 程序与底层操作系统,让同一份字节码能在不同平台上运行。 ## 主要组成  ### 类加载器 负责将.class 文件(字节码)加载到 JVM 内存中,并转换为 JVM 可识别的 “类对象”(Class 对象)。 核心机制:**双亲委派模型**(防止恶意类篡改系统类,比如自定义一个java.lang.String类,会被父加载器拒绝加载,保障核心类的安全)。 ### 允许时数据区 VM 在运行时划分的内存空间,用于存储程序数据,包括: - 方法区(Method Area):存储类信息、常量、静态变量等(JDK 8 后改为元空间 Metaspace,使用本地内存)。 - 堆(Heap):存储对象实例(所有new出来的对象),是垃圾回收的主要区域。 - 虚拟机栈(VM Stack):存储方法调用的局部变量、操作数栈等(线程私有,与方法执行生命周期一致)。 - 本地方法栈(Native Method Stack):为 Native 方法(如调用 C/C++ 的方法)提供内存支持。 - 程序计数器(Program Counter Register):记录当前线程执行的字节码指令地址(线程私有,唯一不会 OOM 的区域)。 ### **执行引擎** 负责执行字节码指令,有三种执行方式: - 解释执行:逐条翻译字节码为机器码并执行(启动快,执行慢)。 - 即时编译(JIT,Just-In-Time):将热点代码(频繁执行的代码)编译为本地机器码缓存,后续直接执行(执行快,启动稍慢,主流 JVM 默认启用)。 - 自适应优化:结合解释执行和 JIT,动态调整优化策略。 ### 垃圾回收器 垃圾回收器-GC,Garbage Collector 自动管理堆内存中 “不再被使用的对象”(垃圾),释放内存空间,避免内存泄漏。常见的 GC 实现有 SerialGC、ParallelGC、G1、ZGC 等。 ### **本地方法接口** 本地方法接口-JNI,Java Native Interface 允许 Java 代码调用本地语言(C/C++)编写的方法,扩展 Java 的能力(但也可能引入安全风险,比如本地方法不受 JVM 安全机制约束)。 ## JVM 与Java JVM 不仅是运行环境,更是 Java 安全机制的 “守护者”,很多安全特性依赖 JVM 实现。 ### 字节码验证 类加载过程中,JVM 会对字节码进行严格校验,确保其符合 Java 规范(如指令合法性、类型安全、栈操作正确性等),防止恶意构造的字节码(如修改指令跳转、越界访问内存)破坏 JVM。 例如:反序列化漏洞中,攻击者构造的恶意字节流最终会被转换为字节码,字节码验证会拦截部分明显非法的指令,但复杂的攻击链可能绕过验证。 ### 沙箱机制 JVM 早期为 Applet(网页小程序)设计了严格的权限控制,通过 “沙箱” 限制不可信代码的操作(如禁止访问本地文件、网络连接等)。 核心依赖: - 安全管理器(SecurityManager):已在 JDK 17 中弃用,曾是沙箱的核心,通过检查 “权限请求”(如FilePermission)决定是否允许操作。 - 访问控制器(AccessController):替代 SecurityManager 的部分功能,基于 “保护域(ProtectionDomain)” 控制类的权限。 ### 类加载安全 双亲委派模型确保系统核心类(如java.lang.String、java.net.Socket)只能由启动类加载器(Bootstrap ClassLoader)加载,避免恶意类伪装成系统类窃取权限(比如伪造java.lang.System类执行恶意操作)。 ### 内存安全 JVM 通过自动内存管理(GC)和类型检查,减少了 C/C++ 中常见的内存安全漏洞(如缓冲区溢出、野指针)。但 JVM 本身的漏洞(如 JIT 编译优化 bug)可能被利用(例如 2021 年的 Log4j 漏洞虽非 JVM 本身,但依赖 JVM 的类加载机制)。
毛林
2025年10月27日 20:59
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码