性能问答>请教一下,jvm8里面静态变量、常量、常量池存放在堆里还是元空间?>
6回复
2年前

请教一下,jvm8里面静态变量、常量、常量池存放在堆里还是元空间?



请教一下,jvm8里面静态变量、常量、常量池存放在堆里还是元空间?

5834 阅读
请先登录,再评论

可以通过基本类型与引用类型来区分,引用类型指向的是对象,对象都放在堆上(排除栈上分配),一个成员变量需要看是否属于这个类类型的也就是所谓的静态修饰的,如果是静态修饰的属于这个类的一部分和类对象一样躺着堆里,如果不是静态修饰的可以认为在栈上。而纯字符串、符号引用是比较特殊的都存在常量池,1.8常量池已经在metaspace了,可以认为存放在no class space。不知道能理解不?

2年前
回复 林志豪:

这边说得有点问题,静态变量应该在方法区,而方法区在metaspace里

2年前回复

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,其唯一目的是存放对象实例。

12年前

静态变量或者常量指向的值本身也可能是对象,所以这种对象就是在堆里,至于引用本身就是是klass元数据里一部分,存在在metaspace里

2年前
回复 zlba111:

从jdk7开始静态变量和它的java.lang.Class对象一起存放在堆上

2年前回复
回复 Balloon:

如果静态变量或常量指向的是基本类型,这些基本类型存在哪里呢?

2年前回复