了解java内存区域首先看一下java虚拟机运行时数据区,如下图所示:
我们首先了解一下java虚拟机运行时数据区各部分的存储信息和运行信息.
1,程序计数器
程序计数器也被叫做字节码行号指示器,它是在JVM中仅占一片较小的内存区,如名,它的主要作用就是指向当前运行线程的下一条运行字节码指令.我
们知道java虚拟机是可以多线程运行的,但是本质上还是通过线程执行切换的方式进行.为了避免程序计数器执行混乱,因此程序计数器是线程私有的.
2,Java虚拟机栈
和程序计数器一样,虚拟机栈也是线程私有的.每一个线程都是一个方法,而每一个方法都是一个独立的栈帧,栈帧中保存着方法的局部变量表 操作数
栈 动态链表以及方法出口等信息.一般情况下,虚拟机栈其实就是指的方法的局部变量表部分.而局部变量表其实就保存着各种基本数据变量(int short long double float boolean byte char)以及对象引用.我们需要注意,如果执行方法请求栈的深度超过虚拟机所允许的深度,那么就会抛出*Error异常;同样虚拟机可>以动态扩展,如果扩展无法申请到足够的内存时就会抛出OutOfMemoryError异常.
3,本地方法栈
本地方法栈和java虚拟机栈的作用非常类似,只不过java虚拟机栈保存着java的执行方法,而本地方法栈保存着Native方法.注意:本地方法栈和java>虚拟机栈一样,也会抛出*Error异常和OutOfMemoryError异常
4,java堆
java堆是内存共享的区域,一般也是分配内存最大的区域,原因是该存储区域存储的是对象和数组数据.因此java堆也是垃圾收集区的主要区域,所以>在很多时候也被叫做"GC堆".java堆可以处于物理上不连续的内存空间,只要逻辑上连续即可.如果java堆中不能为对象或数组完成内存的分配了,那么就会产生OutOfMemeryError异常.
5,方法区
方法区同样是内存共享的区域,它主要用来存储被加载的类信息 常量信息 静态变量 及时编译器编译后的代码等数据.它也被叫做"非堆".也是GC的>主要区域.同样会产生OutOfMemeryError异常.我们还要介绍一下方法区中的运行时常量池:
常量池主要是为了存储编译期间产生的各种字面变量和符号引用,这部分内容常在类加载后进入方法区的运行时常量池中存放.
~
相关文章
- 对抗静态分析——运行时修复dex
- tomcat运行时JVM参数调整
- JavaScript是如何工作的:引擎,运行时和调用堆栈的概述!
- JavaScript是如何工作的01:引擎,运行时和调用堆栈的概述!
- 如何显示/隐藏菜单项以及如何在运行时创建它?
- How Javascript works (Javascript工作原理) (二) 引擎,运行时,如何在 V8 引擎中书写最优代码的 5 条小技巧
- 《深入理解Java虚拟机》第三章读书笔记(三)——经典垃圾回收器
- .Net 7 高端玩法,自定义一个CLR运行时
- 深入理解java虚拟机学习笔记(二)垃圾回收策略
- 深入理解Java虚拟机学习笔记(三)-----类文件结构/虚拟机类加载机制