java JVM内存相关

半世苍凉 提交于 2020-04-06 00:26:24
大家平时知道的java的内存分为栈和堆,一般new出来的对象都是在堆上的。这里用的是一般,也就是说在有些情况下可能不是分配在堆上。在一定的情况下对象也是可以分配到栈上的。首先看一下java JVM运行时的数据区:
图中的 方法区是所有线程共享的, 虚拟栈本地方法栈程序计数器是线程私有的。也就是说虚拟栈,本地方法和程序计数器是线程隔离的。程序计数器是唯一不会出现oom的部分。
程序计数器可以看成当前线程执行的字节码的行号暗示器。
虚拟机栈和线程的生命周期是一样的,当线程执行的时候会创建一个栈帧,用于存放当前线程的方法出口,局部变量表,操作数栈,动态连接等信息。
本地方法栈用于调用native方法使用。
是所有线程共享的部分,用于存储创建的对象。
方法区和堆一样都是所有线程共享的,方法区主要用于存放虚拟机加载的类的信息,常量,静态常量等信息。
除了运行时数据区外还有一部分内存是不受虚拟机管理的部分,这一部分就是直接内存,直接内存是直接在物理的memory分配,我们经常使用的 ByteBuffer. allocateDirect 就是直接在物理内存上分配的。但是在虚拟机里面会有这部分内存的引用,以便对这一部分内存进行管理。
 
本文内容参考《深入理解JAVA虚拟机》
 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!