当前位置: 首页 > news >正文

java里的静态成员变量是放在了堆内存还是栈内存

转自http://bbs.csdn.NET/topics/370001490

堆区: 

1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 
栈区: 
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 
方法区: 
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 

2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

 

 

 

程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内在的分配,有六个地方都可以保存数据:
1、 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。
2、 堆栈。驻留于常规RAM(随机访问存储器)区域。但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些java数据要保存在堆栈里——特别是对象句柄,但java对象并不放到其中。
3、 堆。一种常规用途的内存池(也在RAM区域),其中保存了java对象。和堆栈不同:“内存堆”或“堆”最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相碰的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间
4、 静态存储。这儿的“静态”是指“位于固定位置”。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但java对象本身永远都不会置入静态存储空间。
5、 常数存储。常数值通常直接置于程序代码内部。这样做是安全的。因为它们永远都不会改变,有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
6、 非RAM存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给另一台机器,而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技艺就是它们能存在于其他媒体中,一旦需要,甚至能将它们恢复成普通的、基于RAM的对象。

 

首先,java里面是没有静态变量这个概念的,不信你自己在方法里面定义一个static int i =0;java里只有静态成员变量。它属于类的属性。至于他放在那里?楼上说的是静态区。我不知道到底有没有这个翻译。但是 深入jvm里是是翻译为方法区的。虚拟机的体系结构:堆,方法区,本地方法栈,pc寄存器。而方法区保存的就是一个类的模板,堆是放类的实例的。栈是一般来用来函数计算的。随便找本计算机底层的书都知道了。栈里的数据,函数执行完就不会存储了。这就是为什么局部变量每一次都是一样的。就算给他加一后,下次执行函数的时候还是原来的样子。

相关文章:

  • Rancher-k8s加速安装文档
  • 个人觉得实用的Python姿势
  • create-react-app项目添加less配置
  • 研究发现:硅基导模量子集成光学芯片研制成功
  • Intel新一代超低功耗Atom曝光:尺寸超小
  • Spring Cloud构建微服务架构:分布式配置中心【Dalston版】
  • 智能家居产业格局初稳 企业非零和博弈
  • 数据转换例子
  • 机器学习(Machine Learning)深度学习(Deep Learning)资料
  • 【NOIP2012】借教室
  • h5中sessionStorage和localStorage的使用
  • Unobtrusive JavaScript 的七条规则
  • logback logback.xml常用配置详解(三) filter
  • 教你如何如何进行域内时间同步及时间常用命令总结
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • 深入了解以太坊
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 2017 年终总结 —— 在路上
  • Bytom交易说明(账户管理模式)
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES6语法详解(一)
  • Js基础知识(四) - js运行原理与机制
  • leetcode98. Validate Binary Search Tree
  • mysql 数据库四种事务隔离级别
  • MySQL-事务管理(基础)
  • Redis 中的布隆过滤器
  • swift基础之_对象 实例方法 对象方法。
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 大主子表关联的性能优化方法
  • 记录一下第一次使用npm
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 《天龙八部3D》Unity技术方案揭秘
  • 带你开发类似Pokemon Go的AR游戏
  • ​TypeScript都不会用,也敢说会前端?
  • ###STL(标准模板库)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (4) PIVOT 和 UPIVOT 的使用
  • (poj1.3.2)1791(构造法模拟)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (转载)OpenStack Hacker养成指南
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net refrector
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [ 第一章] JavaScript 简史
  • [《百万宝贝》观后]To be or not to be?
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [CareerCup] 14.5 Object Reflection 对象反射
  • [Docker]五.Docker中Dockerfile详解
  • [IE9] GPU硬件加速到底是实用创新还是噱头