一 数据存储位置                                

我们先来谈谈数据的存储位置,有五个地方可以存储数据

(1)寄存器:这是最快的存储区,因为它位于不同于其他存储区的地方-处理器内部。对于程序员来说是透明的不能直接控制,并且数量有限。

(2)堆栈:位于通用RAM(随机访问存储器)中,通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;反之,则释放那些内存。java的对象引用存储在堆栈中。

(3)堆:一种沟通用的内存池(也位于RAM区),用于存放所有的java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在对立面存活多长时间。因此在堆中分配存储有很大的灵活性。当需要一个对象时,只需要new写一个简单的代码,当执行这个代码时,会自动在堆里面进行存储分配。

(4)常量存储:常量值通常会放到程序代码内部,这样做的是安全的的,因为它永远不会被改变。

(5)非RAM存储:如果数据完全存活于程序之外,那么他可以不受任何程序的控制,在程序没有运行时也可以存在。其中最基本的两个例子就是流对象和持久化对象。

二 java内存区域

上图为java虚拟机运行时数据区。

(1)程序计数器:线程私有的。可以看成是当前线程所执行字节码的行号指示器。在虚拟机的概念模型里,通过改变这个程序计数器来选取吓一跳需要执行的字节码指令。

(2)java虚拟机栈:线程私有的。虚拟机栈是java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用到完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。局部变量表存放了编译器可预知的各种个基本数据类型、对象引用个指向了一条字节码指令的地址。

(3)本地方法栈:线程私有的。  与虚拟机栈的作用类似,虚拟机栈为java方法提供服务,而本地方法栈则为虚拟机使用到的NATIVE方法服务。

(4)java堆:线程共享的。几乎所有的java对象实例都在这里分配存储。java堆是垃圾回收器管理的主要区域。

(5)方法区:线程共享的。用于存储已被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。方法区包含运行常量池,CLASS文件除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区运行时常量池中存放。

java常量池与对象存储的更多相关文章

  1. 【转载】Java常量池

    本篇随笔为转载,原贴地址:Java常量池理解与总结. (其实Java的常量池有点像C++中的存储字符串常量的常量存储区). 一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法 ...

  2. java常量池理解

    String类两种不同的创建方式 String s1 = "zheng"; //第一种创建方式 String s2 = new String("junxiang" ...

  3. java常量池詳解

    一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池在Clas ...

  4. java虚拟机学习-Java常量池理解与总结(13-2)

    一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池在Clas ...

  5. [转]java常量池理解总结

    一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池在Clas ...

  6. 触摸java常量池

    java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下. 理论 小菜先拙劣的表达一下jvm虚拟内存分布:      程序计数器是jvm执行程序的 ...

  7. java常量池概念

    在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...

  8. java 常量池

    在jvm规范中,每个类型都有自己的常量池.常量池是某类型所用常量的一个有序集合,包括直接常量(基本类型,String)和对其他类型.字段.方法的符号引用.之所以是符号引用而不是像c语言那样,编译时直接 ...

  9. java常量池中基本数据类型包装类的小陷阱

    想必大部分学过java的人都应该做过这种题目: public class Test { public static void main(String[] args) { //第一个字符串 String ...

随机推荐

  1. Linux运维学习笔记-网络安全等级保护

    网络安全等级保护简介与作用: 验证信息系统是否满足相应安全保护等级的一个过程. 对不同信息系统分等级进行保护.

  2. swift 分页视图

    var data:NSArray! var scrollView: UIScrollView! var pageCtrl: UIPageControl! override func viewDidLo ...

  3. AI产业将更凸显个人英雄主义 周志华老师的观点是如此的有深度

    今天无意间在网上看的了一则推送,<周志华:AI产业将更凸显个人英雄主义> http://tech.163.com/18/0601/13/DJ7J39US00098IEO.html 摘录一些 ...

  4. threejs通过射线Ray获取指定的点

    例:获取cube方向上的面的中点坐标(该cube默认方向为(0,1,0)) (中心点向cube quaternion 方向上发射射线,与正前方的面相交的点即为目标点; 由于ray只支持box和face ...

  5. mysql中的隐式转换

    在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引.下面分析两种隐式转换的情况 看表结构 phone为 int类型,name为 varchar EXPLAI ...

  6. 《DSP using MATLAB》Problem 2.15

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  7. selenium定位元素的8种方法

    By.id,By.name,By.tagName,By.className,By.linkText,By.partialLinkText,By.xpath,By.cssSelector <a h ...

  8. asm335x系列adc和触摸屏驱动(转)

    An analog-to-digital converter (abbreviated ADC) is a device that uses sampling to convert a continu ...

  9. ProcessHelp 进程类(启动,杀掉,查找)

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  10. vs2015 去除 git 源代码 绑定

    第一次碰到这个问题,想将源代码签入TFS管理.添加到源码管理后,默认添加到Git源码管理. 研究过后,发现: 1)删除框内文件 2)Vs2015->工具->选项->源代码管理-> ...