JVM---内存结构

此篇博客为参考Hollis的“Java工程师成神之路(2018修订版)”学习过程中的学习笔记


目录

      • 目录
    • 虚拟机内存结构图
    • 程序计数器
    • 虚拟机栈
    • 本地方法栈
    • java堆
    • 方法区
    • 运行时常量池
    • 附加–直接内存

虚拟机内存结构图

JVM---内存结构_第1张图片

线程之间互相独立的区域有:

虚拟机栈 、本地方法栈、程序计数器

线程可以共享数据的区域:

方法区 、堆


程序计数器

程序计数器的作用就是将各个线程下次所执行的(字节码)行号(准确来说是指令的地址)记录下来,以保证其下次执行时可以正确的执行。

虚拟机栈

虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈和出栈的过程。

本地方法栈

本地方法栈与虚拟机栈锁发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈为虚拟机执行Native方法服务。需要注意的是,由于虚拟机规范对于本地方法栈的具体实现没有做强制要求,所以Sun HotSpot直接把本地方法栈和虚拟机栈合二为一。

java堆

我们都知道使用new关键字生成的变量都存在堆中,而且堆得回收由垃圾回收器(GC))自动回收。
在Java虚拟机规范中的描述是:所有对象实例以及数组都要在堆上分配。

方法区

方法区用于存储已经被虚拟机加载的类信息,常量(“zdy”,”123”等),静态变量(static变量)等数据。

运行时常量池

运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量(“zdy”,”123”等)和符号引用。运行时常量池具有动态性,并非只有Class文件中的内容才能进入运行时常量池,运行期间也能将新的常量放入池中。如String.intern()方法。

附加–直接内存

直接内存,不是Java虚拟机规范中定义的内存区域,但是这一部分仍然会出现OutOfMemoryError异常。

JDK1.4中加入新的NIO(New Input/OutPut)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,可以通过Native函数库直接分配堆外内存,然后通过Java堆中的DirectByteBuffer对象来对这块内存的引用进行操作,避免数据在Java堆与Native堆中数据的来回复制。


你可能感兴趣的:(java学习笔记)