目录
虚拟机学习系列 - 1 - 运行时数据区域
虚拟机学习系列 - 2 - 垃圾收集概述
虚拟机学习系列 - 3 - 垃圾收集算法
虚拟机学习系列 - 4 - 垃圾收集器
虚拟机学习系列 - 5 - 内存分配与回收策略
虚拟机学习系列 - 附 - OQL(对象查询语言)
之前很少关注过jvm及其相关支持
由于最近项目总是出现OutOfMemory,很无奈,android分给每个应用的内存有限
所以打算看看GC相关知识,索性就把虚拟机的知识也一起看了吧
希望自己能提升一下
刚开始接触,肯定会有不少遗漏,希望大家指点并提出建议
有些我觉得对我工作用处暂时不是很大的知识可能不会整理在内
毕竟整理的过于全面就和抄写一遍书本没啥区别了
第一本书选为:深入理解java虚拟机 - 周志明
运行时数据区域的知识之前整理过一点,用的是xmind
下面就把整理的内容截图贴上,顺便再补充些说明
图片较大,所以我就把它咔嚓了
运行时数据区域可以做如下划分
(图1)
具体可分为下面几个部分
1.程序计数器
(似乎离我还有一定距离,笔记见图3)
2.java虚拟机栈
3.本地机栈
栈分为两个部分,看名字也知道区别是什么,下面以java虚拟机栈为例
生命周期:和线程相同
虚拟机栈描述的是java方法执行时的内存模型。每个方法被执行时都会创建一个栈帧,用于存储:
局部变量表
操作数栈
动态链接
方法出口
每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈从入栈到出栈的过程
栈的局部变量表:存放了编译期可知的基本数据类型和引用
在栈里有两种常见且重要的异常
StackOverFlowError:线程请求的栈深度>虚拟机所允许的深度
(大部分虚拟机都允许动态扩展,java虚拟机规范也允许固定长度)
OutOfMemory:当扩展时无法申请到足够的内存
4.java堆
java虚拟机规范规定:java堆可以处于物理上不连续的内存空间,只要逻辑上连续即可
(垃圾回收等内容在后续笔记中会整理)
5.方法区
用来储存已被虚拟机加载的类信息、常量、静态变量,即时编译器编译后的代码数据
运行时常量池:方法区一部分,编译期生成的字面量和符号引用,类加载后存放到这里
(图2)
(图3)