JVM解析----内存布局
终于到了最经典的部分了,开搞开搞~
首先,按照惯例,我们先慢慢引出JVM内存布局,那怎么引出呢?当当当~
内存
我们(好吧,是我是我,我承认)常常忽略这个看似不起眼,实则非常非常重要的东西——内存。内存是硬盘和CPU之间的桥梁,承载着操作系统和应用程序的试试运行。
JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高校稳定运行。这里有个小东西需要注意一下,不同的JVM对于内存的规划方式和管理机制不同(小差异),我们现在说的JVM内存布局是指结合JVM虚拟机规范下,最经典的内存布局。
少废话,直接上图:
那么图也看了,滚吧~
咳咳,不好意思,接下来我们来详解一下JVM中的五大内存区域。
堆(线程共享)
堆是线程共享的,是OOM(out of memory)故障最主要的发源地(这里为什么说是最主要呢,因为OOM还可以发生在虚拟机栈、方法区等位置),它存储着几乎所有的实例对象。那这里为什么又说是几乎所有呢?难道还有不存储在堆中的对象吗?
是的,在Java中,典型的对象不在堆上分配的情况有两种:TLAB(Thread Local Allocation Buffer)和栈上分配(严格来说TLAB也是属于堆,只是在TLAB比较特殊),我这里简单说一下栈上分配。
栈上分配