类成员变量在哪里分配

作者: 志哥666 | 来源:发表于2018-04-23 16:27 被阅读23次

大家都知道,类被加载到JVM是放在所谓的方法区: JDK7之前是持久代(PermGen),JDK7开始是元空间(metaspace)。所以不免也会简单地认为,类的成员变量(变量本身,而不是变量指向的对象)也是分配在方法区里。

本篇呢,就通过HSDB这个工具,来分析下类的静态变量到底在哪里分配,同时熟悉下如何使用HSDB这个工具查看Java内存信息。

一、启动Java进程

我们通过debug模式运行如下代码,将断点放在打印System.out.println("test")这一行:

package hsdb
public class Test {

    static Test t1 = new Test();

    public static void main(String[] args)throws Exception {
        System.out.println("test");//此行打断点
    }
}

二、启动HSDB

通过如下命令启动HSDB:

sudo java -cp .:$JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.HSDB

会弹出如下窗口:


1.png

执行jps -ml获取上边我们运行的Test类的pid,然后在HSDB窗口点击File-->Attach to HotSpot process,输入Test的pid,点击ok。

三、分析

现在我们的HSDB已经连接上了我们的Test进程。如下图:


2.png

选择Tools-->Object Histogram,可以看到Test进程里的所有对象列表,如图:


3.png

输入我们的Test类的类名,找到Test类的实例对象,然后双击。得到对象所在内存的地址,如下图:


4.png

有了Test对象所在的内存地址后,我们就可以反向查找:谁拥有指向Test对象的引用。点击Windows-->Console打开控制台,按enter后执行"revptrs Test对象地址" 命令,如下图:


5.png
从结果中我们可以看到,是一个Class类型的对象里有一个指向Test对象的引用。这个Class类型的对象地址是0x0000000795786878

通过Class类型的对象地址,我们查看下Class类型对象的内容。
点击HSDB窗口Tools-->Inspector,然后输入Class类型对象的地址后敲enter,得到如下图:


6.png

我们可以看到,在Class类型的对象里,确实有一个t1变量指向了Test对象,通过指向的地址,可以判断就是我们之前搜索到的Test类型的对象。

到这里我们知道了,t1这个类成员变量,被放在了Class类型的对象里,我们只要确定这个Class类型对象所在内存的位置,也就知道了t1变量所在内存的位置。

点击Tools-->Heap Parameters 显示堆内存的地址范围,如下图:


7.png

通过比较Class类型对象的地址,我们可以看出,Class类型的对象分配在了新生代,即Java堆里,而不是方法区。

相关文章

  • 类成员变量在哪里分配

    大家都知道,类被加载到JVM是放在所谓的方法区: JDK7之前是持久代(PermGen),JDK7开始是元空间(m...

  • C++基础学习

    1. 类的静态成员和非静态成员区别是: 类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过...

  • 内存对齐

    定义 在结构或者类中,编译器为每个成员变量按照其自然边界(alignment)分配空间,各个成员变量按照它们被声明...

  • 第十二章 类和动态内存分配

    不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存。对于静态类成员,可以再类声明之外...

  • No_16_0226 Java基础学习第七天

    [TOC] 成员变量与局部变量 成员变量与局部变量区别:A:在类中的位置不同成员变量:在类中,方法外局部变量:在方...

  • 成员变量与局部变量

    成员变量:定义在类中的属性,可以被当前的所有方法访问,成员变量如果没有手动初始化,则java系统会分配默认值(引用...

  • 【JAVA】Java中的变量划分

    0x01 变量的划分 成员变量直接定义在类中的变量类成员变量:在成员变量前面加static实例变量:没加stati...

  • iOS 属性和成员变量(Category)

    属性和成员变量 成员变量:在类接口部分或类实现部分定义的变量,所有的成员变量起始都是实例变量,并不是真正的类变量,...

  • static关键字和final关键字

    static 在类中,用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同,在整个...

  • 成员变量和局部变量,匿名对象,this

    /* * 成员变量与局部变量的不同: * A:在类中的位置不同 * 成员变量:在类中方法外; * 局部变量:在...

网友评论

    本文标题:类成员变量在哪里分配

    本文链接:https://www.haomeiwen.com/subject/zyellftx.html