《深入理解Java虚拟机》:Java内存区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 , 这些区域称作运行时数据区域 , 分为5个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区 。
这是在网上找的一张图 , 今天就来把各个区的用途和创建销毁时机来说一下 。
文章插图
1、程序计数器:它是当前程序执行的字节码的行号指示器 , jvm执行引擎具体要执行哪一行指令 , 是由程序计数器来指示的 。 javap是jkd自带的反编译命令 , 在命令行执行以下命令 , 得到MyStack的字节码文件 , 程序计数器指示的就是#1,#2,#3之类的行号:
javap -verbose MyStack.class > MyStack.txtConstant pool:#1 = Class#2//com/bill99/MyStack#2 = Utf8com/bill99/MyStack#3 = Class#4//java/lang/Object#4 = Utf8java/lang/Object#5 = Utf8
2、虚拟机栈:每个方法在执行的时候都会创建一个栈帧 , 用于存储局部变量、操作数栈、动态链接、方法出口等信息然后压入虚拟机栈 , 每一个方法结束对应出栈的操作 。 如下示例代码 , debug调用栈也是main()方法先入栈 , 然后print()入栈 , print()执行结束出栈 , main()执行 。
如下public class MyStack{ public void print(){System.out.println("print()"); } public static void main(String[] args) {MyStack myStack = new MyStack();myStack.print(); }}
文章插图
这块区域常见异常有两种:线程请求栈的深度大于虚拟机栈所允许的深度 , 将抛出StackOverflowError;栈扩展的时候无法申请到足够内存空间 , 则抛出OutOfMemoryError 。
改写一下print()方法 , 让它不断递归调用自己 , 可以看到栈深度到1万以上抛异常了 。
private static int depth = 0;public void print(){System.out.println("print()"+(++depth));print();}print()11422Exception in thread "main" java.lang.StackOverflowError
3、本地方法栈:由于java代码本身的限制 , 有些和操作系统直接交互的方法 , 可能是基于c或者c++编写的 , java代码可以通过本地方法间接的去调用操作系统底层的一些功能 。 本地方法运行时使用的内存空间就是本地方法栈 。 比如Thread类的一些方法 , 如下:
public static native Thread currentThread();public static native void yield();
- 内存大厂跨界之作!芝奇Enki 360一体式水冷评测:高密度冷排稳压18核心
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 旗舰|OPPO Find X3曝光:骁龙888/12G内存
- 威刚为英特尔12代Alder Lake平台准备了64GB DDR5-8400内存模组
- 曝Redmi Note 10 Pro获认证:8GB内存
- 学习大数据是否需要学习JavaEE
- 三星让渡部分DRAM产能:内存价格或暴涨
- vivo新机亮相跑分平台 配8GB内存搭载天玑820芯片
- Linus Torvalds谈ECC内存的重要性 痛斥英特尔正在扼杀它
- 威刚联手技嘉、微星调试DDR5内存:单条64GB、频率8400MHz