JVM高级特性和最佳实践书籍总结

第一部分:Java内存区域与内存溢出异常

java程序在运行时,会把管理的内存划分为:方法区,虚拟机栈,本地方法栈,堆,程序计数器

1.程序计数器:是一块较小的内存区域,它的作用可以看做当前线程所执行的字节码的行号指示器。在虚拟机中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器时间的方式。因此为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间的计数器互不影响吗,独立存储。

2.虚拟机栈:也是线程私有的,它的生命周期与线程相同。每一个方法被调用直至执行完成的过程,就对应着一个栈帧从虚拟机栈中从入栈到出栈的过程(栈帧:是方法运行期的基础数据结构)

3.本地方法栈:与虚拟机栈所发挥的作用是非常相似的。区别就是虚拟机栈为虚拟机执行java方法服务。而本地方法栈执行的为虚拟机使用到的native方法。

4.堆:是所有线程共享的一块内存区域,在虚拟机启动时创建。唯一目地就是存放对象的实例,从内存回收的角度来看,由于收集器基本都是采用的分代收集算法。

5.方法区:和Java堆一样,是各个线程共享的内存区域。它用来存储已被虚拟机加载的类信息,常量,静态变量,访问修饰符

6.访问方式:句柄,指针;如果使用句柄 访问,java堆中将会划分一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象的实例数据和类型数据各自的地址信息;如果使用指针访问方式,java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象地址。



猜你喜欢

转载自blog.csdn.net/qq_39141360/article/details/79321548