前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM-不同jdk版本静态变量存储位置

JVM-不同jdk版本静态变量存储位置

作者头像
程序员朱永胜
发布2023-11-15 09:53:38
3380
发布2023-11-15 09:53:38
举报
文章被收录于专栏:朱永胜的私房菜

!! 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

!! 全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001

1. 什么是 JDK?

JDK(Java Development Kit)是一个软件开发工具包,它提供了开发 Java 应用程序所需的所有工具、编译器和库的集合。

2. 静态变量是什么?

静态变量,也被称为类变量,是在类的定义中使用 static 关键字声明的变量。静态变量存储在内存中的数据区域,与其他全局变量相似,因此它们的生命周期和应用程序的生命周期相同。在一个类中所有的实例都可以访问和更改静态变量,它们被所有类实例共享,而不是每个实例都有一份属于自己的变量副本。

3. 不同 JDK 版本静态变量存储位置的原理

不同 JDK 版本使用不同的 JVM 实现,并且不同的操作系统上 JVM 的行为也会有所不同。使用 JVM 内存模型概念来解释,不同的版本和实现 JVM 的具体方式也不同。对于静态变量,每个 JVM 实现可能会将它们存储在不同的位置。

3.1 早期 JDK 环境

在早期版本的 JDK 中,JVM 使用了方法区来存储静态变量。在 Java 6 及之前的版本中,方法区本质上是一个永久代(PermGen),它又被称为静态存储区,它是 JVM 内存模型中的一个区域,它负责存储类内的常量、静态变量、类的信息和方法信息等。这个区域的生命周期与 JVM 的生命周期相同,它的大小可以通过启动参数配置。静态变量存储在该区域的某个位置,以供所有类实例访问。

3.2 JDK 8 及之后版本

在 Java 8 及之后的版本中,永久代被 Metaspace 所替代,而 Metaspace 已被放置在堆中。所以,在这些版本中,静态变量被存储在堆中。Metaspace 是 JVM 中的一块内存区域,它用于存储类信息和 JIT 编译器生成的代码,其大小也可以通过启动参数来设置。在较新的版本中,JVM 已经使用了一种叫做“CompressedClassSpace”的技术来节省 Metaspace 的内存使用。

4. 静态变量存储位置的实验

这里给出一个简单的实验来验证不同 JDK 版本静态变量存储位置不同的事实。

在 Java 6 及之前的版本中,我们可以通过下面的代码来验证静态变量存储在方法区中:

代码语言:javascript
复制
public class StaticVariable {
    private static int count = 0;

    public StaticVariable() {
        count++;
    }

    public static int getCount() {
        return count;
    }
}

下面是验证代码:

代码语言:javascript
复制
for(int i = 0; i < 10; i++) {
   StaticVariable sv = new StaticVariable();
}
System.out.println("StaticVariable Count: " + StaticVariable.getCount());

由于该版本的 JVM 使用的是 PermGen 作为方法区,在执行上述代码后,我们可以在输出信息中看到静态变量存储到了方法区:

代码语言:javascript
复制
StaticVariable Count: 10

在 Java 7 及之后的版本中,我们可以通过下面的代码来验证静态变量存储在堆中:

代码语言:javascript
复制
public class StaticVariable {
    private static int count = 0;

    public StaticVariable() {
        count++;
    }

    public static int getCount() {
        return count;
    }
}

下面是验证代码:

代码语言:javascript
复制
for(int i = 0; i < 10; i++) {
   StaticVariable sv = new StaticVariable();
}
System.out.println("StaticVariable Count: " + StaticVariable.getCount());

由于该版本的 JVM 使用的是 Metaspace 作为堆中的一部分,在执行上述代码后,我们可以在输出信息中看到静态变量存储在堆中:

代码语言:javascript
复制
StaticVariable Count: 10

5. 总结

我们从以上可以看出,JDK 版本不同,JVM 对静态变量的管理方式不同,因此静态变量所存储的位置也不同。在 Java 6 之前,静态变量存储在 JVM 的方法区中,而在 Java 7 之后的版本中,静态变量存储在 JVM 的堆中。来自同一 JDK 版本的 JVM 实现将在存储静态变量的方式上保持一致。了解 JVM 对 Java 中不同类型的变量的处理方式有助于我们编写更健壮、更高效的 Java 代码。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是 JDK?
  • 2. 静态变量是什么?
  • 3. 不同 JDK 版本静态变量存储位置的原理
    • 3.1 早期 JDK 环境
      • 3.2 JDK 8 及之后版本
      • 4. 静态变量存储位置的实验
      • 5. 总结
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档