java虚拟机(第二版) 第二章总结 (一)

版权声明: https://blog.csdn.net/ttt_12345/article/details/82978946

本文主要是up主阅读java虚拟机(第二版) 第二章总结的总结,因为第一章主要讲了java体系的过去和展望,故就暂时总结了,感兴趣的可以阅读原书。

另外推荐看原书,原书对我总结的知识有更细致的解读。

众所周知,java虚拟机对内存的自动管理,让java程序员少了好多手动管理内存的操作,省了不少事情,但也让内存泄漏和内存溢出等内存问题变的“高深莫测”。毕竟不常用到的东西就会越不熟悉。

1、(原书2.2.1)程序计数器

线程私有,可以看成是当前线程所执行的字节码的行号指示器,在虚拟机的概念模型汇总,比如分支、循环、跳转、线程恢复等都依赖于这个计数器的值,特别是在多线程环境,每个线程是来回切换的,正是程序计数器保证切换后能恢复到正确的执行位置。是唯一一个不会抛出OutOfMemoryError异常的区域。

2、(原书2.2.2)java虚拟机栈

线程私有,我们常把java内存笼统的划分为堆内存和栈内存,而栈内存其实就是指的虚拟机栈,或者说是虚拟机栈中的局部变量表部分。虚拟机栈是方法执行的内存模型,每个方法执行时都会创建一个栈帧。方法从调用到执行完成的过程, 就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。栈帧可以阅读书中第八章内容或者等up主进行总结。

局部变量表可存放各种基本数据类型( boolean、 byte、 char、 short、 int、float、 long、 double) 、 对象引用和returnAddress类型 。

会出现两种异常:StackOverflowError和OutOfMemoryError,前者是由于线程请求栈深度大于虚拟机的可用栈深度抛出,后者虚拟机栈无法扩展到足够的内存时抛出,(当-Xmx和-Xms参数相同时,栈内存为固定大小,不可扩展,当两个参数不同时,栈可扩展)

3、(原书2.2.3)本地方法栈

线程私有,和虚拟栈作用非常相似,唯一不同是此区域是为虚拟机使用到的Native方法服务。同样会抛出StackOverflowError和OutOfMemoryError两个异常。

4、(原书2.2.4)java堆

线程共享,几乎所有实例对象都在此区域存放,(JIT编译器的发展与逃逸分析技术逐渐成熟, 栈上分配、 标量替换等的应用使得所有对象都在堆上分配变的不是那么”绝对”,上面几个名词书中有详细介绍)。

是垃圾收集器管理的主要区域。被分为Eden空间、 From Survivor空间、 To Survivor空间等(如果使用java自带的VisualVM查看,可以看到此类划分中各个空间实时的使用情况)。

此区域会抛出OutOfMemoryError异常。

5、(原书2.2.5)方法区(现在叫元数据区)

线程共享,用于存储已被虚拟机加载的类信息、 常量、 静态变量、 即时编译器编译后的代码等数据。

会抛出OutOfMemoryError异常


6、(原书2.2.6)运行时常量池

线程共享,为方法区的一部分,用于存放编译期生成的各种字面量和符号引用。

7、(原书2.2.7)直接内存

即为你机器的真是内存大小,和java虚拟机无关的内存区域,但频繁地被使用, 而且也可能导致OutOfMemoryError异常出现。

特别是jdk1.4后加入的NIO类,它可以使用Native函数库直接分配堆外内存,因避免了在Java堆和Native堆中来回复制数据
而显著提高性能,但如果堆内存太大导致直接内存不够使用,也会抛出OutOfMemoryError。(有时我们机器会报OutOfMemoryError,但在我们调大堆内存或者方法区的内存或者栈内存等操作后还是会报OutOfMemoryError,此时就要考虑系是不是直接内存不够用了)。

本文暂时总结了java虚拟机(第二版)中的2.2节的主要知识点,和一些up主自己的知识点,如果有记忆差错,还望见谅,后面我会找时间继续的,最后,我总结的知识点比较简练,如果需要了解详细内容的话,请阅读原书。也欢迎大家关注我的公众号号 “up随想”,关注后或许会收到up主的小福利哦!!

猜你喜欢

转载自blog.csdn.net/ttt_12345/article/details/82978946