《深入理解Java虚拟机》阅读总结:程序计数器、Java堆

前言:大家应该都挺熟悉Java虚拟机所管理的内存包括以下几个运行时的数据区域:方法区、虚拟机栈、本地方法栈、堆、程序计数器。但是呢,不一定深入具体的了解其中的细节部分。本篇涉及程序计数器和Java堆,来自我阅读的总结,属于我认为的书中精华内容,舍弃了相对不重要的部分,下次则聊聊剩下的Java虚拟机栈和本地方法栈~

程序计数器

一、程序计数器是一块较小的内存空间,它可以看作当前线程所执行的字节码的行号指示器,这个和操作系统中线程切换时PCB(程序控制块)保留中断现场的程序计数器类似,也是处理分支、循环、线程恢复等功能。

二、Java多线程是通过线程轮流切换、分配处理器的执行时间,在操作系统中就是时间片轮转调度算法在java中的体现,每一个线程都分配相等的执行时间,一个处理器(对于多处理器来说是一个内核)都会执行一个线程中的指令。每个线程都有一个独立的程序计数器,各线程的程序计数器互不影响,独立存储,这类内存区域为“线程私有”内存。

Java堆  

一、Java堆是虚拟机管理的内存中最大的一块。它是被所有线程共享的一块内存区域,此内存区域的唯一目的就是存放对象实例。

即实际代码中new的对象。

二、Java堆是垃圾收集器管理的内存区域,现代的垃圾收集器大部分都是基于分代收集理论设计的,所以Java堆中经常会出现"新生代","老年代","永久代","Eden空间"等名词。

三、十多年前(以G1收集器的出现为分界),业界主流的HotSpot虚拟机,它的内部垃圾收集器全部基于"经典分代"来设计,需要新生代、老年代收集器搭配才能工作。但是到了今天已经不可同日而语,HotSpot中出现了不用分代设计的新垃圾收集器。

四、《Java虚拟机规范》规定,Java堆可以处于物理上不连续的内存空间中,但逻辑上应该是连续的。这就像磁盘空间存储文件一样,不要求每个文件都连续存放,但是对于如数组对象,多数虚拟机出于实现简单、高效的考虑,很可能会要求连续的内存空间。

五、Java堆可以实现成固定大小的,例如默认分配12个G的内存(比较大),也可以是可扩展的,例如分配2G内存(比较小)。当前主流的虚拟机可以通过参数(-Xmx和-Xms设定)。若Java堆中没有内存完成实例分配而且无法扩展时会抛出OutOfMemoryError异常。

猜你喜欢

转载自blog.csdn.net/Zhongtongyi/article/details/107214753
今日推荐