jvm静态对象实例在放法区还是堆中
方法区和GC堆是不冲突的两个概念,在JVM规范中,方法区被定义为一种逻辑区域,而方法区具体怎么实现是各JVM的实现细节,所以方法区的内容在堆里也好,不在堆里也好都是符合标准的。
比如曾经HotSpot中,永久代就约等于方法区,而IBM的J9以及在Java7以后的HotSpot中就不是这样设计的;至于本题中的静态实例,目前的HotSpot是在堆中存储的。
另:如果题主有类似的疑问,又是使用的Oracle的JDK的话,可以启动sun.jvm.hotspot.HSDB(在JDK目录/lib/sa-jdi.jar里)来加载一段简单的Java代码,然后获取到你感兴趣的某一个变量oop的内存地址,工具可以查询到这个内存地址在JVM的存储位置。
实践一下:
以下操作在Oracle JDK 1.8.0_144下完成。
先编写如下代码:public class Main { private static String a = "test"; private static Main b = new Main(); public static void main(String... args) { }}存在两个静态变量,一个字符串,一个Main,运行时使用HSDB连接这个运行中的虚拟机,得到两个oop的地址:
查看确实是那个字符串和Main:
再进一步查看他们的位置:
可见两个静态变量都在Java堆中。
■网友
这个嘛,简单说一下
过去是放在方法区中,但是这个方法区是否在heap里面
这个jvm没有定义出来,所以不同的jvm可以有自己的实现
并不冲突
但是在某一个版本之后,这个区被取消了,一律归入heap里面
如果你不纠结于过去,只看当下的话,最新版本的基本上都在堆里面
■网友
静态对象实例当然存放在Heap里面咯,方法区存储静态变量,存储的只是对象的引用,方法区中的静态变量可以作为GC ROOT存在。
■网友
你说的方法区跟栈有啥区别,堆一般放new出来的对象
■网友
误人子弟一波。
方法区存放类定义,静态对象实例存在于堆中。
换句话说:类定义在方法区中,实例在堆中。
我原来回答的这是什么玩意,误人子弟。
方法区是JVM的规范,不同虚拟机有不同的实现方式,我们常说的Hotspot虚拟机,它1.7版本实现方式就是永久代,1.8版本是元空间。
■网友
谢邀。所谓方法区不是官方叫法。Java 7 之前这个叫做 Permgen,Java 8 开始变成 Metaspace。两者包含内容相同,但是有一个最大的区别,Permgen 是在 JVM 内存区内(但是并不属于Heap),受到 JVM 内存限制制约。Metaspace 属于原生内存在JVM之外,基本上机器有多少内存就可以多大。
Permgen 与 Metaspace 内容包含类定义,方法的Byte码,常量,以及 JVM 优化的一些其他占用。这里特别提到字符串常量,在程序中直接写的或者用 String.intern 加入的都会放在这一个区里。
好了说了这么多,主题思想是:JVM 静态对象在Heap里。静态对象也是对象并没有受到特别对待。
引用O社官方微博 Presenting the Permanent Generation
So the Java classes are stored in the permanent generation. What all does that entail? Besides the basic fields of a Java class there are
Methods of a class (including the bytecodes)Names of the classes (in the form of an object that points to a string also in the permanent generation)Constant pool information (data read from the class file, see chapter 4 of the JVMspecification for all the details).Object arrays and type arrays associated with a class (e.g., an object arraycontaining references to methods).Internal objects created by the JVM (java/lang/Object or java/lang/exception for instance)Information used for optimization by the compilers (JITs)
推荐阅读
- 静态展示|全新Model Y参数正式曝光,性能出众,很多人都喜欢
- 结婚对象的抉择
- 咨读君|交警提醒:即日起,这些汽车禁止上路,已经成为严查对象
- 扬州|扬州三鸟友养鹦鹉被追刑责 警方:爱动物要找对对象
- 金晨|金晨新约会对象遭扒,武汉人讲话台湾腔还疑穿高仿,这个也难成?
- 因为打代码冷落的对象,最后分了,想听听大家的看法
- 太平洋汽车网|宝马4系敞篷版静态体验 躲不过“真香”定律
- 陆虎|07届快男陆虎公布恋情,女方是陈曌旭,本尊还艾特错对象让人大笑
- 关于 lua 使用c++对象 并添加自定义属性的内存管理问题
- 趣头条|风格大不同 现代途胜L静态对比大众途岳
