最近看深入理解java虚拟机,讲方法区的部分说到jdk7把字符串常量池和静态变量等从永久代移出了,但好像没说这两者移出后放到了什么地方,在网上查了一下,看到字符串常量池从jdk7开始就被放到了堆中,但是我始终没搜到jdk7关于静态变量的存放位置
最近看深入理解java虚拟机,讲方法区的部分说到jdk7把字符串常量池和静态变量等从永久代移出了,但好像没说这两者移出后放到了什么地方,在网上查了一下,看到字符串常量池从jdk7开始就被放到了堆中,但是我始终没搜到jdk7关于静态变量的存放位置
Java里面没有什么静态变量一说吧。我概念有点混。Java里面常说的是类静态成员变量。这个变量是和类在一起的。应该是在方法区里面。你在在找点资料吧。我也不是很清楚的样子。希望这个回答可以给你一点意见性作用。
15 回答8.2k 阅读
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
先说结论:JDK7以上,静态变量存储在其对应的Class对象中。而Class对象作为对象,和其他普通对象一样,都是存在java堆中的。
所谓方法区、GC堆,都是JVM规范定义的逻辑模型,他们的具体实现并没有规定死,不同的虚拟机可以有不同的实现策略。也就是说,方法区和GC堆并不是冲突的概念,方法区甚至可以放在GC堆里面。
在Oracle的bug database中,有静态域迁移至Class对象的记录
参考:move static fields into Class to prepare for perm gen removal