深入理解虚拟机--内存部分

来源:互联网 发布:java 垃圾回收面试 编辑:程序博客网 时间:2024/04/26 20:06

之前对虚拟机的内存分配部分一直用一些困惑,研究了一下午终于搞明白了 ^-^
这里写图片描述

堆:堆是虚拟机内存分配最大的一个部分,存放着全部对象的实例。JAVA的垃圾回收机制也是主要对这个部分中的内容进行回收。它是线程共享的。

方法区:方法区中主要存储的是类加载进内存时候的基本信息,比如类的说明,接口信息等等。除此之外还包含着运行时常量池。在运行时常量池中存放着常量以及静态的属性。同样它也是线程共享的。

虚拟机栈:虚拟机栈会在调用方法的同时产生一个叫做栈帧的特殊数据结构。这个数据结构的生命周期随着方法的产生而产生,当方法结束后而销毁。栈帧中包含着,局部变量表,操作数栈,动态链接,方法返回地址。线程私有

局部变量表:它里面存储着方法中的局部变量以及方法的参数。里面的基本数据类型是以一个叫做变量槽为单位进行划分。long 和
double占两个变量槽,其他的基础类型和引用都占一个变量槽。里面的第一位为当前对象的变量槽,也就是this。之后依次进行排列。变量槽是可以进行重用的。当一个方法中的变量的生命周期结束之后这个变量槽就可以二次分配给其他的变量。GC进行垃圾回收的时候也是对这个局部变量表进行检索,如果还有对应的变量槽与之对应就不会回收相应的变量。线程私有

操作数栈:方法中都存在着很多的操作方法。比如加减乘除等等,当检索到这些操作方法的时候就会把这个方法对应的变量压入到操作数栈当中去在进行相应的操作数进行运算,得到结果之后在把结果进行出栈。整个流程完成。线程私有

动态链接:用来引用运行时常量池中的信息。线程私有

方法返回地址:当方法进行正常返回或者异常返回的时候,去恢复上一个方法的局部变量表以及操作数栈,以及让上一个方法的程序计数器向下指向,这些信息都是存储在这个区域当中的。并且还包含着这个方法的返回值,返回值存储到调用方法的操作数栈当中。线程私有

本地方法栈:用来存储调用native方法的信息也就是对其他语言底层调用的指向,线程私有。

程序计数器:相当于一个指针用来指向当前的字节码文件执行的行数,如果执行完当前行,加一执行下一行,生命周期和线程生命周期相同,线程私有。

直接内存:属于堆中的一部分,相当于一个缓存的机制,当与naticve调用C语言进行交互的时候总是会进行内存信息的复制等,这个内存DirectByteBuffer这个对象直接对其调用直接引用native方法下的内存。

—————————————————— 欢迎找茬——————————————————————–

0 0
原创粉丝点击