JVM
代码沙箱机制
Java 中的代码沙箱(Sandbox)机制是一种安全措施,旨在限制 Java 应用程序的行为,以防止潜在的安全风险。它为应用程序提供了一个受控的执行环境,确保这些应用只能访问被允许的资源和功能,从而保护主机系统免受恶意或不可信代码的危害。沙箱机制在 Java Applet 和 WebStart 应用中尤为重要,因为这些应用通常是通过互联网下载并在用户的计算机上运行的。
Native关键字
在 Java 中,native
关键字用于声明一个方法,表明该方法的实现不是用 Java 语言编写的,而是用其他编程语言(如 C 或 C++
)实现的。这种特性允许 Java 程序调用本地操作系统资源或与其他非 Java 编写的代码进行交互,从而扩展了 Java 的功能范围。
栈
在Java虚拟机(JVM)中,栈(Stack)是用于管理方法调用和局部变量的一种数据结构。每个线程在创建时都会创建一个私有的Java虚拟机栈(JVM Stack),其中保存了帧(Frame)的列表,每个方法调用都会创建一个新的帧。
Java虚拟机栈
每个线程都有自己的虚拟机栈,独立于其他线程。
栈的生命周期与线程相同,即当线程启动时创建,线程结束时销毁。
栈帧
每次调用一个方法时,都会创建一个新的栈帧,并将其压入当前线程的 Java 虚拟机栈顶。
当方法执行完毕后,该栈帧会被弹出并丢弃,控制权返回给上一个栈帧对应的方法。
栈帧包含方法的局部变量数组、操作数栈、动态链接、方法出口等信息。
局部变量数组
存储了方法参数和方法内部定义的局部变量。
局部变量数组中的每一个槽位(Slot)可以存储基本数据类型或对象引用,但不能直接存储对象本身,对象总是存储在堆中。
操作数栈
用于存储操作数和计算结果。
主要用于指令集的操作数传递和运行结果的暂存。
动态链接
用来支持方法调用链上的回溯,比如访问外层方法的局部变量或静态变量。
方法出口信息
包含正常完成出口和异常完成出口的信息,用于确定方法执行结束后如何将控制权返还给调用者。
栈溢出
如果单个线程的 Java 虚拟机的栈深度超过限制,就会抛出
StackOverflowError
错误。这通常发生在递归调用过深的情况下。
内存不足
如果线程创建的 Java 虚拟机栈所需的内存超出了进程内存的限制,或者没有足够的本地内存来分配新的栈,就会抛出
OutOfMemoryError
。