回想起去年这个时候,我还在加班搞 iOS 出包,真是唏嘘。
JVM 中的 Runtime data area
这个 Runtime data area 是我们开发接触最多的,比较常见的
stackoverflowExecption ,OutOfMemoryExecption
都是这个 Runtime data area 中的一部分区域爆满了,才会抛出的异常
Runtime data area 的 区域划分
- JAVA Heap
- Method Area
- JAVA Virtual Machine Stacks
- Native Method Stacks
- Program Counter Register
还是 老样子,建议大家学习的时候记英文,比如 Program Counter Register ,我看其他博客都是翻译成 程序计数器,甚至很多书都这么写。
实际上翻译 Register 是寄存器,这个翻译的正确中文翻译应该是 程序计数寄存器,用来 给 Execution engine 使用的,通过改变 Program Counter Register的值,来决定下一条需要执行的字节码指令
JAVA Heap
HEAP 是 Runtime data area 中占用空间最大的一部分区域,因为 HEAP 是被线程共享的,绝大部分的对象实例都在这里分配内存,比如 读取一张大图,这个时候可能会导致 OutOfMemoryExecption,那就是 堆的空间不够分配了,就会抛出异常。
Method Area
Method Area 在我理解是一个类似货物入库登记表的东西,当有货物入库的时候会在表上面登记货物的具体信息。实际在 jvm 中用来存储 ClassLoader 加载类之后获得的类的信息,常量,静态变量
JAVA Virtual Machine Stacks
stacks 是为函数调用服务的,是线程私有的,用来存储函数内的局部变量以及返回结果,用来管理函数的调用。每一次函数调用就会压入一个 stack frame,所以 当我们写一些死循环递归调用的时候,就会出现 stackoverflowExecptioon,压入栈内 的函数数量超过了栈的容纳限制
以上是我个人学习 JVM 的理解,如有错误,请大方指出