一 数据存储位置                                

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

(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. nginx配置文件的性能优化

    1.nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数.worker_processes 8; 2.为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或 ...

  2. ssh的时候提示No user exists for uid 501

    原来是oh my zash升级导致的.关闭iterm2然后重新打开iterm2就可以了

  3. 【LGR-051】洛谷9月月赛

    [LGR-051]洛谷9月月赛 luogu 签到题 description 给出\(K\)和质数\(m\),求最小的\(N\)使得\(111....1\)(\(N\)个\(1\))\(\equiv k ...

  4. VUE的使用方法

    vueInit: function() { var _this = this; this.vue = new Vue({ el: '#pa', data: { //存放初始化数据 sourceData ...

  5. ambassador 学习五 配置文件简述

    Ambassador 配置通过yaml 的定义文件 格式 apiVersion 版本,当前支持的版本为 ambassador/v0 kind 支持的类型,目前有Module AuthService R ...

  6. Visual Studio 2005 自带单元测试

    一 单元测试简介   单元测试是代码正确性验证的最重要的工具,也是系统测试当中最重要的环节.也是唯一需要编写代码才能进行测试的一种测试方法.在标准的开发过程中,单元测试的代码与实际程序的代码具有同等的 ...

  7. 【转】VC++10(VS2010)IDE各种使用技巧

    原文网址:http://www.cnblogs.com/sunrisezhang/articles/2802397.html 一个好的coder,他首先必须是一个熟练工.对于C++程序员来说,只有掌握 ...

  8. 洛谷[P1002]过河卒

    原题地址:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...

  9. 学习笔记之C++入门到精通(名师教学·手把手教会)【职坐标】_腾讯课堂

    C++入门到精通(名师教学·手把手教会)[职坐标]_腾讯课堂 https://ke.qq.com/course/101465#term_id=100105503 https://github.com/ ...

  10. 在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能

    1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel ,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和 导出  ...