精华内容
下载资源
问答
  • 两种数据类型的内存

    2015-04-23 14:21:23
    基本类型(primitive types),基本类型共有8,即int, short, long, byte, float, double, boolean, char(注意,并没有string基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;形式来定义,称为...

    基本类型(primitive types)

    基本类型共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是,自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。
    另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义
      int a = 3;
      int b = 3;
    编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。
    特别注意的是,这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也即刻反映出这个变化。相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例,我们定义完a与 b的值后,再令a=4;那么,b不会等于4,还是等于3.在编译器内部,遇到a=4;时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

    包装类数据

    如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中,Java用new()语句来显示地告诉编译器,在运行时才根据需要动态创建,因此比较灵活,但缺点是要占用更多的时间。
    String是一个特殊的包装类数据。即可以用String str = new String(“abc”);的形式来创建,也可以用String str = “abc”;的形式来创建(作为对比,在JDK 5.0之前,你从未见过Integer i = 3;的表达式,因为类与字面值是不能通用的,除了String。而在JDK 5.0中,这种表达式是可以的!因为编译器在后台进行Integer i = new Integer(3)的转换)。前者是规范的类的创建过程,即在Java中,一切都是对象,而对象是类的实例,全部通过new()的形式来创建。Java 中的有些类,如DateFormat类,可以通过该类的getInstance()方法来返回一个新创建的类,似乎违反了此原则。其实不然。该类运用了单例模式来返回类的实例,只不过这个实例是在该类内部通过new()来创建的,而getInstance()向外部隐藏了此细节。那为什么在String str = “abc”;中,并没有通过new()来创建实例,是不是违反了上述原则?其实没有。
    关于String str = “abc”的内部工作。Java内部将此语句转化为以下几个步骤:
      (1)先定义一个名为str的对String类的对象引用变量:String str;
      (2)在栈中查找有没有存放值为”abc”的地址,如果没有,则开辟一个存放字面值为”abc”的地址,接着创建一个新的String类的对象o,并将o 的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为”abc”的地址,则查找对象o,并返回o的地址。
      (3)将str指向对象o的地址。
    值得注意的是,一般String类中字符串值都是直接存值的。但像String str = “abc”;这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用!
    为了更好地说明这个问题,我们可以通过以下的几个代码进行验证。
      String str1 = “abc”;
      String str2 = “abc”;
      System.out.println(str1==str2); //true
    注意,我们这里并不用str1.equals(str2);的方式,因为这将比较两个字符串的值是否相等。==号,根据JDK的说明,只有在两个引用都指向了同一个对象时才返回真值。而我们在这里要看的是,str1与str2是否都指向了同一个对象。
    结果说明,JVM创建了两个引用str1和str2,但只创建了一个对象,而且两个引用都指向了这个对象。
      我们再来更进一步,将以上代码改成:
      String str1 = “abc”;
      String str2 = “abc”;
      str1 = “bcd”;
      System.out.println(str1 + “,” + str2); //bcd, abc
      System.out.println(str1==str2); //false
    这就是说,赋值的变化导致了类对象引用的变化,str1指向了另外一个新对象!而str2仍旧指向原来的对象。上例中,当我们将str1的值改为”bcd”时,JVM发现在栈中没有存放该值的地址,便开辟了这个地址,并创建了一个新的对象,其字符串的值指向这个地址。
    事实上,String类被设计成为不可改变(immutable)的类。如果你要改变其值,可以,但JVM在运行时根据新值悄悄创建了一个新对象,然后将这个对象的地址返回给原来类的引用。这个创建过程虽说是完全自动进行的,但它毕竟占用了更多的时间。在对时间要求比较敏感的环境中,会带有一定的不良影响。
      再修改原来代码:
      String str1 = “abc”;
      String str2 = “abc”;
      str1 = “bcd”;
      String str3 = str1;
      System.out.println(str3); //bcd
      String str4 = “bcd”;
      System.out.println(str1 == str4); //true
    str3 这个对象的引用直接指向str1所指向的对象(注意,str3并没有创建新对象)。当str1改完其值后,再创建一个String的引用str4,并指向因str1修改值而创建的新的对象。可以发现,这回str4也没有创建新的对象,从而再次实现栈中数据的共享。
    我们再接着看以下的代码。
      String str1 = new String(“abc”);
      String str2 = “abc”;
      System.out.println(str1==str2); //false
      创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。
      String str1 = “abc”;
      String str2 = new String(“abc”);
      System.out.println(str1==str2); //false
      创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。
    以上两段代码说明,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。

    展开全文
  • 数据中心硬件买家可以评估两种新兴服务器类型内存,搭建未来高性能系统。 高带宽内存(HBM)是一种用于支持内存设备数据吞吐量高性能接口,其性能远超常规形式的内存。 混合存储立方(HMC)技术带来远超传统高带宽...

    数据中心硬件买家可以评估两种新兴的服务器类型内存,搭建未来高性能系统。

    高带宽内存(HBM)是一种用于支持内存设备数据吞吐量的高性能接口,其性能远超常规形式的内存。

    混合存储立方(HMC)技术带来远超传统高带宽内存设计的性能,如双倍数据率三代与四代(DDR3和DDR4),但是这两种方法采用的技术不同,它们对服务器内存性能的提升也有所不同。

    高带宽内存的未来服务器

    HBM的思路十分直接:让内存设备靠近CPU或GPU。当前的计算机设计一般会通过将内存模块安装在主板的插槽上,隔离内存与计算芯片。这类型的服务器内存受到了时钟率的限制,阻碍每个时钟周期数据的可传输量。

    HBM方法将内存芯片堆叠到一个矩阵里,接着将处理器与内存堆叠组合在一起,形成一个基本组件,然后将其安装到服务器主板上。

    HBM栈并不是物理上与CPU和GPU集成,而是采用载板。然而,相关支持的半导体制造商如AMD表示,HBM方案与在处理器上集成存储器的方案没有太大区别。

    因此,HBM到底有哪些优势?HBM模块可以在极低的频率与更少的能耗下提供远超常规内存的带宽。例如,根据AMD的研究,一个典型的图形DDR5包使用32位总线,在1,750MHz,1.5伏电压下,最高带宽为28GB每秒。一个HBM包使用1,024位总线,只需要500MHz,1.3V电压,就能达到超过100GB的带宽。而且,HBM提供了与CPU或集成GPU支持服务器的多功能性。未来服务器可能会出现HBM同时服务CPU和GPU的情况。

    混合存储立方如何影响未来服务器?

    传统服务器内存类型,如DIMM,使用服务器主板上的并行接口连接独立芯片。混合存储立方与之相反,通过堆叠存储芯片到垂直组件,创建3-D阵列的串行内存访问。这些阵列增加了一个逻辑层来管理内存,而且服务器制造商可以在每个处理器附近安装这个组件。这种近内存或短距离设计是比较常见的,而且能够提供比标榜低功耗的远距离内存架构提供更高的性能。

    混合存储立方可以最多连接8个包。根据HMC联合会,也就是推动该标准的供应商组织声称,HMC能够提供DDR3内存设备15倍的带宽,节约70%的能耗并且物理尺寸仅为其90%。例如,美光的2GB与4GB HMC产品技术号称带宽能达到120GB和160GB。HMC产品现已上市,而且像Intel的Xeon Phi图形协处理器采用HMC技术,能比GDDR5内存设备提升约50%的内存吞吐量。

    HMC与HBM互相竞争,两种技术不兼容。
    本文转自d1net(转载)

    展开全文
  •  //数组:可以存储多个数据,是一数据类型,属于引用数据类型  //定义一个可以存储五个数数组  //new int[5];  //为了使用数组,需要给数组起个名字  int [] arr = new int[5];  //数组是

    class Demo25

    {

       public static void main(String[] args)

      {

        //数组:可以存储多个数据,是一种数据类型,属于引用数据类型

       //定义一个可以存储五个数的数组

       //new int[5];

       //为了使用数组,需要给数组起个名字

       int [] arr = new int[5];

       //数组是使用下边来存储或取出数据的

      arr[0]=66;//放入第一个位置,66;

      System.out.println(arr[0]); 

     }

    }


    java程序在运行时,jvm会把内存分为5块区域:栈,堆,方法区,本地方法区,寄存器

    栈:先进后出,局部变量进栈(在函数中定义的变量,在语句中定义的变量)

            局部变量的作用域一旦结束,立刻释放内存

    堆:存数的是实体(数组,对象),实体的共性是可以存储多个数据

           特点: 1、有默认值;2、垃圾回收机制;



    class Demo27

    {

     public static void main(String[] args)

      {

        //int a= 23;基本数据类型,赋值的是这个数据本身;

        //int[] arr = new int[5];引用数据类型,是赋给arr首地址

       }

    }



    展开全文
  • 内存屏障种类型

    千次阅读 2018-09-05 16:20:20
    Load1 和 Load2 代表条读取指令。在Load2要读取数据被访问前,保证Load1要读取数据被读取完毕。   StoreStore屏障: 抽象场景:Store1; StoreStore; Store2 Store1 和 Store2代表条写入指令。在Store...

    LoadLoad屏障

    抽象场景:Load1; LoadLoad; Load2

    Load1 和 Load2 代表两条读取指令。在Load2要读取的数据被访问前,保证Load1要读取的数据被读取完毕。

     

    StoreStore屏障:

    抽象场景:Store1; StoreStore; Store2

    Store1 和 Store2代表两条写入指令。在Store2写入执行前,保证Store1的写入操作对其它处理器可见

     

    LoadStore屏障:

    抽象场景:Load1; LoadStore; Store2

    在Store2被写入前,保证Load1要读取的数据被读取完毕。

     

    StoreLoad屏障:

    抽象场景:Store1; StoreLoad; Load2

    在Load2读取操作执行前,保证Store1的写入对所有处理器可见。StoreLoad屏障的开销是四种屏障中最大的。

    展开全文
  • java变量的两种类型

    千次阅读 2019-01-24 16:09:59
    首先要明白为什么需要数据类型? 数据类型在计算机语言中,是对内存位置一个抽象表达方式。...java中变量分为两种类型 - 基本类型 int、float、double、boolean、char… 不具备对象特性(不...
  • Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义一些基本类型的变量和对象引用变量都是在函数内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,...
  • 内存分配的两种方法

    2018-03-20 20:07:57
    我们都知道内存分配有两种方法: new和malloc。他们有哪些相同点和不同点呢?一,new是系统API函数,而malloc是库函数也即意味着在程序中调用malloc函数需要加载malloc.h头文件才能使用。二,new创建对象除分配...
  • 目前支持两种类型的资源隔离:CPU和内存,对于这两种类型的资源,Yarn使用了不同资源隔离方案。对于CPU而言,它是一种“弹性”资源,使用量大小不会直接影响到应用程序存亡,因此CPU资源隔离方案采用了Linux ...
  • PHP的两种特殊类型

    2017-08-27 16:54:00
    1.php中第一特殊类型---资源 资源:资源是专门函数来建立和使用,例如打开文件、数据连接、图形画布。我们可以对资源进行操作(创建、使用和释放)。任何资源,在不需要时候应该被及时释放。如果我们忘记了...
  • 多任务处理的两种类型: 1、基于进程  进程是指一种“自包容”的运行程序,由操作系统直接管理,直接运行。有自己的地址空间,每一个进程开启都会消耗内存。基于进程的特点是允许计算机同时运行两个或多个程序。 ...
  • 今天主要讲一下String的两种赋值方式在内存中的区别以及intern方法 String的两种赋值方式如下 1、String a=“abc”; 2、String a=new String("abc"); 讲主题之前我们先简单回顾基本类型和引用类型内存存储方面...
  • C#的两种数据类型:值类型,引用类型类型: byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。 1. 值类型变量声明后,不管是否赋值,编译器都给它分配内存。 2. ...
  • 在函数中定义一些基本类型的变量和对象引用变量都是在函数栈存内中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量作用域后,java会自动释放掉为该变量分配的内存...
  • js的两种数据类型

    2016-07-13 12:55:00
    js中数据类型总体来说分为两种,他们分别是: 1值类型(基本类型):数值型(Number),字符类型(String),布尔值型(Boolean),null 和 underfined 2引用类型(类):函数,对象,数组等 值类型理解:变量...
  • 内存管理系统根据变量的类型为变量分配存储空间,分配空间只能用来储存该类型数据。 因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。 Java中有类型 内置数据类型(基本数据类型) ...
  • 1.两种数据类型我们知道,在JS中数据类型按照访问方式和存储方式不同可分为基本类型和引用类型。2.基本类型基本类型有String、Boolean、Number,Undefined、Null,这些基本类型都是按值传递,也称为值类型。3....
  • 两种类型的区别:储存位置不同 原始数据类型直接储存在栈(stack)中简单数据,占据空间小/大小固定,属于被频繁使用数据,所以放在栈中储存。 引用数据储存在堆中对象 : 占据空间大,大...
  • 一、数据类型分类 基本数据类型 字符串类型(String)、数字类型( Number)、布尔类型( Boolean)、空( Null)、未定义...在js引擎中对变量存储主要有两种位置,堆内存和栈内存。 存储对象:栈内存主要用于存储
  • 字节序两种类型的通俗理解

    千次阅读 2016-06-18 21:45:17
    学习C语言中结构体时,学到位段的知识,在理解位段知识时又牵扯出了字节序。看了好几遍没看懂,仔细查阅才理解,现...这也就是字节序的两类型。 字节序:(多字节类型数据的)多个字节在内存中的存储顺序 两个让
  • String类和常量池内存分析例子以及8基本类型

    千次阅读 多人点赞 2019-01-21 19:52:51
    该篇例子几乎涵盖了目前所有能解决的类型,以一种通俗的语言讲解出来。当然如果JVM内存基本问题不太会可以看这里:JVM...1 String 对象的两种创建方式 String str1 = "abcd"; String str2 = new String("abcd"); Sy...
  • boolean类型的两种比较是否相同的方法 (数值a)==(数值b) 判断两个数值大小是否相同 若比较两个字符或字符串时是比较两个的内存地址是否相同 (字符串a).equals(比较的字符串b) 判断两个字符串是否相等,大小写...
  • 题目点评 数据类型是所有程序都会涉及到,是计算机语言比较基础知识,这种问题被问到可能性其实并不大,这样题目只要花点时间把它...两种类型的区别是:存储位置不同; 原始数据类型直接存储在栈(stack)中...
  • 两种类型的区别是:存储位置不同; 原始数据类型直接存储在栈(stack)中简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储; 引用数据类型存储在堆(heap)中对象,占据空间大、大小不固定,...
  • 关于统一存储多种子类型对象到定长共享内存的问题 缘起 在项目组的游戏服务器中,有一系列的对象,它们派生自同一个基类,比如Role为Player,Monster的基类等。 各个派生类会有自己独特的属性及方法,这是必然...
  • 内存类型

    2019-05-29 08:52:07
    外存:用于存储的ROM,两种。 NorFlash:可总线访问,直接接到CPU地址空间,以内存的方式来访问(容量小,价格高,一般用作启动介质) NandFlash: 不能总线方式访问,使用命令接口时序访问,iROM区域就是用于Nand...
  • 两种内存池技术(C++实现)

    千次阅读 2019-05-17 12:21:37
    内存池就是其中的重要技术手段之一,下面重点看看常见的两种内存池技术。 1、基于某种类型的内存池 此种内存池使用广泛,实现相对简单,基本能够满足大部分时候的需求,使用模板实现,保证了一种内存池针对一...
  • 当我们在linux系统中进行进程间通信时,会发现例如共享内存,信号量,消息队列等方式时,会发现有System v以及POXIS两种类型。因此,我们探究一下System v和POXIS到底代表着什么意义。 POSIX POSIX(Portable ...
  • 相信有一定java开发经验人或多或少都会遇到OutOfMemoryError问题,这个问题曾困扰了我很长时间,随着解决各类问题...jvm管理的内存大致包括三不同类型的内存区域:Permanent Generation space(永久保存区域)、H
  • 在函数中定义一些基本类型的变量和对象引用变量都在函数内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量作用域后,Java会自动释放掉为该变量所分配的内存空间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,603
精华内容 5,441
关键字:

内存的两种类型