欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 编程语言 > java >内容正文

java

java 静态变量 存储-ag凯发k8国际

发布时间:2024/10/8 java 1 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 java 静态变量 存储_java学习笔记9---类静态成员变量的存储位置及jvm的内存划分... 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

笔记8提到了类静态成员变量的访问方式,但静态成员变量存储在哪里呢?在网上查阅不少资料,发现好多内容都是过时的了,其中主流观点是静态成员变量存放在方法区。jdk8之前,静态成员变量确实存放在方法区;但jdk8之后就取消了“永久代”,取而代之的是“元空间”,永久代中的数据也进行了迁移,静态成员变量迁移到了堆中(方法区是jvm的规范,永久代是方法区的具体实现)。

作者: 蝉蝉

请尊重作者劳动成果,转载请在标题注明“转载”字样,并标明原文链接:

http://www.cnblogs.com/chanchan/p/7726724.html

除了静态成员变量,虚拟机是如何划分内存来存储各种信息的呢?jvm中的内存共分为程序计数器、堆、虚拟机栈、本地方法栈和方法区五个部分。详见下图:

注:静态成员变量、常量池由方法区迁移到堆

元空间在本地内存

下面简单介绍一下其他区域:

程序计数器:又称pc寄存器,英文全称为program counter register。在实际硬件平台上,pc寄存器存放下一条将要执行的指令的地址,cpu根据pc寄存器的内容找到该指令并将其放到指令寄存器中;同时,pc寄存器的中的地址加1,具体加几个字节要看机器的字长,或者由转移指令给出下一条指令的地址。指令执行完后,重复上述步骤,取指令、修改pc寄存器内容、执行指令。此处的程序计数器是jvm内部的虚拟寄存器,功能与实际密码器类似;速度特别快;每个线程都有自己的程序计数器。

堆:由所有线程共享;运行时动态申请的内存都在堆上分配,包括new的对象和数组;jdk8后,静态成员变量、常量池等也在堆中;与c不同,动态申请的内存不需要程序员回收,java有自动垃圾回收机制。

虚拟机栈:每个线程拥有独立的栈;存放局部变量、对象引用、操作数栈、方法出口等;后进先出,被调方法结束后,对应栈区变量等立即销毁。

本地方法栈:主要与虚拟机用到native方法有关。待了解。

方法区:jdk8之前,由永久代实现,主要存放类的信息、常量池、方法数据、方法代码等;jdk8之后,取消了永久代,提出了元空间,并且常量池、静态成员变量等迁移到了堆中;元空间不在虚拟机内存中,而是放在本地内存中。那么,方法区是不是就不属于虚拟机内存的一部分了?还是元空间只是方法区的一部分,还有一部分东西存放在方法区中?待了解。

参考资料:

http://www.cnblogs.com/paddix/p/5309550.html

http://www.cnblogs.com/hadoop-dev/p/7169252.html

总结

以上是ag凯发k8国际为你收集整理的java 静态变量 存储_java学习笔记9---类静态成员变量的存储位置及jvm的内存划分...的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

网站地图