方法区存的是类信息,这个类信息是否包含静态变量,但静态变量只存在于堆内存?

不是说静态变量都在堆里存储,那方法区也存有静态变量是啥意思。还是说方法区只是记录了静态变量的类型,然后赋值的时候在堆里完成?

方法区和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、方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^