jvm内存结构

jvm内存 一条线
线程共享 线程不共线【也叫非线程共享】

线程共享: 堆【Heap】、 方法区【method area】
非线程共享: 程序计数器、虚拟机栈、本地方法栈

方法区还包含 运行时常量池【类常量数据】
内存.jpg

{———-}

1
2
3
4
5
异常:
jvm中定义两种异常 StackOverflow、outofmemory
一种是栈溢出 一种是内存溢出
官方定义栈溢出:线程请求深度大于虚拟机允许深度、抛出StackOverflow
官方定义内存溢出:java内存扩展、当虚拟机申请不到足够的内存、抛出outofmemory

jvm堆
细分:新生代、老年代【分代收集算法】
再细分:Eden、From Survivor、To Survivor空间
再内存分配黑可以分出多个线程私有的分配缓冲区
存放内容:对象实例、细致的划分只是为了更好的回收
堆是回收主要区域

edgn区域 首次存放数据 内存不够会触发 MinorGC

针对老年代 还有MajorGC、Full GC、其中 FUll GC较慢 量级:10倍

jvm方法区
1、线程共享
2、存储已被虚拟机加载、类信息、常量、静态变量、即时编译器编译后的代码数据

jvm运行时常量池
1、方法区一部分
2、存放编译期生成各种字面量和符号引用、

直接内存
1、不属于jvm运行时数据取一部分 再五大板块外、
2、jdk1.4中 引入NIO、引用了一种基于通道(channel)与缓冲区(Buffer)的IO方式、它可以使用Native函数库直接分配对外内存、然后通过一个存储再java堆中的DirectByteBuffer对象来作为这一块内存引用、来进行操作、避免了java堆和native堆中来回复制数据
3、该内存受限于 操作系统和物理内存

虚拟机栈
1、虚拟机执行java程序使用栈

本地方法栈
1、执行native方法使用栈

程序计数器
1、与c交界点、一个线程一个程序计数器、内存耗费较小、记录执行指针