记录:JVM内存模型

算是半个《深入理解java虚拟机第二版》的读书笔记。
周志明大佬的作品,讲的比较深,看的其实也有一点云里雾里。
自己在纸上大概写了写,再归拢一下放在博客上吧。
不保证完全正确。。

这篇文章为第二章的部分理论内容。

内存模型,我个人按照线程私有及线程公有两种类型来进行分类。

线程私有部分

1、程序计数器:线程切换时记录上下文信息,执行java方法时会记录当前指令的地址,线程重新获得cpu时会从这里取出当前指令地址继续执行。

2、虚拟机栈:描述java方法执行的内存模型,包括局部变量表,操作数栈,动态链接,方法出口等。

局部变量表包括基本数据类型(int啊,String啊这些的),对象引用,returnAddress等。编译时确定分配的内存空间大小,运行时不改变。

3、本地方法栈:和虚拟机栈类似,不过本地方法栈特指native方法,不过有的虚拟机对这两种栈不做区分,两种栈合二为一。比如最常见的HotSpot虚拟机就是这样的。

线程私有部分随着线程的创建而创建,随着现成的死亡而死亡。

每一次方法调用都会有一个对应栈帧压入java栈,每一个方法调用结束(return或抛出异常),都会有一个栈帧被弹出。

线程公用部分:

1、java堆:虚拟机启动时创建,存放对象实例,GC主要针对区域。

2、方法区:存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

运行时常量池:方法区的一部分,存放编译期中预置在class文件中的常量池及运行期间生成的新常量。

记录:JVM内存模型_第1张图片

其他

直接内存:堆外内存,比如IO中的缓冲区有用到这种内存。

针对这部分,虚拟机可能会抛出StackOverflowError(方法栈帧超过设定大小)及OutOfMemoryError(内存没有足够连续空间分配了)这两种错误。

这么一总结,好像也没多少东西。。。先这样吧,第二章还有一小部分,下一篇再写。

你可能感兴趣的:(java)