不是说静态变量都在堆里存储,那方法区也存有静态变量是啥意思。还是说方法区只是记录了静态变量的类型,然后赋值的时候在堆里完成?
方法区和Java堆一样,是各个线程共享的内存区域,用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然java虚拟机规范将方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆分开来。
—— 引自《深入理解Java虚拟机》周志明
不同的JVM实现也不一样,以Oracle的HotSpot JVM 为例,JDK7 将字符串常量池从方法区移到了堆中,JDK8 已经移除了方法区,改为元空间。
详细的可以自己去看下《深入理解Java虚拟机》这本书,也可以看下这个博客简单了解一下 https://zhuanlan.zhihu.com/p/107776367
方法区的理解:
虚拟机规范中将方法区看做是堆的逻辑部分,但是对于HotSpotJVM实现上,将堆和方法区分开,认为是两个不同的结构,方法区还有一个别名是Non-Heap(非堆),目的就是要和堆分开。
也可以理解new出来的都在堆里面,方法区里面放的是类的信息。
所以,方法区可以看作是一块独立于Java堆的内存空间。
1、方法区主要存放的是 Class,而堆中主要存放的是实例化的对象
2、方法区(Method Area)与Java堆一样,是各个线程共享的内存区域
3、方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。
4、方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。
5、方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:
不知道你这个问题是否已经解决, 如果还没有解决的话:队列跟消息队列不是一回儿事?TBD
从字面意义上看,肯定是队列的范围更大~
4.参考
04 | 如何利用事务消息实现分布式事务?_william_n的博客-CSDN博客
29 | 流计算与消息(一):通过Flink理解流计算的原理-极客时间
后续补充
...