算是半个《深入理解java虚拟机第二版》的读书笔记。
周志明大佬的作品,讲的比较深,看的其实也有一点云里雾里。
自己在纸上大概写了写,再归拢一下放在博客上吧。
不保证完全正确。。
这篇文章为第二章的部分理论内容。
内存模型,我个人按照线程私有及线程公有两种类型来进行分类。
线程私有部分
1、程序计数器:线程切换时记录上下文信息,执行java方法时会记录当前指令的地址,线程重新获得cpu时会从这里取出当前指令地址继续执行。
2、虚拟机栈:描述java方法执行的内存模型,包括局部变量表,操作数栈,动态链接,方法出口等。
局部变量表包括基本数据类型(int啊,String啊这些的),对象引用,returnAddress等。编译时确定分配的内存空间大小,运行时不改变。
3、本地方法栈:和虚拟机栈类似,不过本地方法栈特指native方法,不过有的虚拟机对这两种栈不做区分,两种栈合二为一。比如最常见的HotSpot虚拟机就是这样的。
线程私有部分随着线程的创建而创建,随着现成的死亡而死亡。
每一次方法调用都会有一个对应栈帧压入java栈,每一个方法调用结束(return或抛出异常),都会有一个栈帧被弹出。
线程公用部分:
1、java堆:虚拟机启动时创建,存放对象实例,GC主要针对区域。
2、方法区:存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
运行时常量池:方法区的一部分,存放编译期中预置在class文件中的常量池及运行期间生成的新常量。
其他
直接内存:堆外内存,比如IO中的缓冲区有用到这种内存。
针对这部分,虚拟机可能会抛出StackOverflowError(方法栈帧超过设定大小)及OutOfMemoryError(内存没有足够连续空间分配了)这两种错误。
这么一总结,好像也没多少东西。。。先这样吧,第二章还有一小部分,下一篇再写。