一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情。
jvm运行时区域一共分为5个区域:线程独享的3个区域:程序计数器、java虚拟机栈、本地方法栈;线程共享区域:java堆、方法区。
程序计数器
- 当前线程锁执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来确定下一条要执行的字节码指令的位置。
- 5个区域中唯一不会出现OOM的区域
java虚拟机栈
- Java方法执行的内存模型,每个方法执行的过程,就是她对应的栈帧在虚拟机栈中入栈到出栈的过程。
- 服务于Java方法
- 可能抛出的异常:
- OutOfMemoryError:在虚拟机栈可以动态扩展的情况下,扩展是无法申请到足够的内存
- StackOverflowError:线程请求的栈深度>虚拟机所允许的深度
本地方法栈
- 服务于native方法
- 可能抛出的异常:与Java虚拟机栈一样
Java堆
- 唯一的目的:存放对象的实例
- 垃圾收集器管理的主要区域
- 可以处于物理上不连续的内存空间中
- 可能抛出的异常:
- OutofMemoryError:堆中没有内存可以分配给新创建的实例,并且堆也无法继续扩展了。
- 虚拟机参数设置
- 最大值:-Xmx
- 最小值:-Xms
- 两个参数设置成相同的值可以避免堆自动扩展
方法区
- 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
- 类型西:即Class类,如雷鸣、访问修饰符、常量池、字段描述、方法描述等。
- 垃圾手机行为在此区域很少发生;
- 不过也不能不清理,对于经常动态生成大龄Class的应用,如Spring等,需要特别注意类的回收状况
- 运行时常量池也是方法区的一部分;
- Class文件中除了有累的版本、字段、方法、接口等描述信息外,还有一项是常量池,用于存放编译器生成的各种字面量(也就是代码中定义的static final 常量)和富豪引用,这部分信息就存储在运行时常量中。
- 可能抛出的异常:
- OutOfMemoryError:方法去无法满足内存分配需求是。