zoukankan      html  css  js  c++  java
  • java六个地方都可以保存数据

    ^l : 手动换行符,即一个向下箭头,产生办法 shift + enter(回车)替换为“”(空。) (是字母l)
    ^p:自动换行符, 产生办法:enter(回车)

    保存到什么地方

    程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据

    (1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。

    (2) 堆栈。驻留于常规 RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。 这是一种特别快、 特别有效的数据保存方式, 仅次于寄存器。创建程序时,Java 编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间” 。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些 Java 数据要保存在堆栈里——特别是对象句柄,但 Java 对象并不放到其中。

    (3)。一种常规用途的内存池(也在 RAM 区域) ,其中保存了 Java 对象。和堆栈不同, “内存堆”或“堆” (Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用 new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!

    (4) 静态存储。这儿的“静态” (Static)是指“位于固定位置” (尽管也在RAM 里) 。程序运行期间,静态存储的数据将随时等候调用。可用 static 关键字指出一个对象的特定元素是静态的。但 Java 对象本身永远都不会置入静态存储空间。

    (5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM) 。

    (6) 非 RAM 存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在, 并在程序的控制范围之外。 其中两个最主要的例子便是 “流式对象” 和 “固定对象” 。对于流式对象,对象会变成字节流,通常会发给另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复成普通的、基于 RAM 的对象。Java 1.1 提供了对 Lightweight persistence 的支持。未来的版本甚至可能提供更完整的方案。

     java的内存机制

    Java 把内存划分成两种:一种是栈内存,另一种是堆内存。

          在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。

      堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。

      这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

    堆栈、堆缓存方式区别

    1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
    2、堆栈是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

    堆和栈的理论知识 

    1、 申请方式     

    堆栈: 由系统自动分配

    堆:需要程序员自己申请

    2.2、申请后系统的响应     

    堆栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。     

    堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部 分重新放入空闲链表中。        

    2.3、申请大小的限制     

    堆栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

    堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储 的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小    受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。              

    2.4申请效率的比较:     

    堆栈由系统自动分配,速度较快。但程序员是无法控制的。     

    堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

    Java中的数据类型有两种。 一种是基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是,自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值存储在常数存储区)

    另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中,Java用new()语句来显式地告诉编译器,在运行时才根据需要动态创建,因此比较灵活,但缺点是要占用更多的时间。

    特殊情况:基本类型

    有一系列类需特别对待;可将它们想象成“基本” 、 “主要”或者“主”(Primitive)类型,进行程序设计时要频繁用到它们。之所以要特别对待,是由于用 new 创建对象(特别是小的、简单的变量)并不是非常有效,因为 new 将对象置于“堆”里。对于这些类型,Java 采纳了与 C 和 C++相同的方法。也就是说,不是用 new 创建变量,而是创建一个并非句柄的“自动”变量。这个变量容纳了具体的值,并置于堆栈中,能够更高效地存取。Java 决定了每种主要类型的大小。就象在大多数语言里那样,这些大小并不随着机器结构的变化而变化。这种大小的不可更改正是 Java 程序具有很强移植能力的原因之一。

    主类型(放置于堆栈内) 大小 最小值 最大值 封装器类型(放置于堆内)

    boolean 1 位 - - Boolean

    char 16 位 Unicode 0 Unicode 2 的 16 次方-1 Character

    byte 8 位 -128 +127 Byte(注释①)

    short 16 位 -2 的 15 次方 +2 的 15 次方-1 Short(注释①)

    int 32 位 -2 的 31 次方 +2 的 31 次方-1 Integer

    long 64 位 -2 的 63 次方 +2 的 63 次方-1 Long

    float 32 位 IEEE754 IEEE754 Float

    double 64 位 IEEE754 IEEE754 Double

    Void - - - Void(注释①)

    ①:到 Java 1.1 才有,1.0 版没有。

    数值类型全都是有符号(正负号)的,所以不必费劲寻找没有符号的类型。主数据类型也拥有自己的“封装器” (wrapper)类。这意味着假如想让堆内一个非主要对象表示那个主类型,就要使用对应的封装器

  • 相关阅读:
    【探路者】Postmortem会议(“事后诸葛亮”会议)
    软件工程第八次作业——例行报告
    感谢
    【探路者】Postmortem会议(“事后诸葛亮”会议)
    软件工程第七次作业——例行报告
    PSP总结报告
    第十二周软件工程作业-每周例行报告
    第十一周软件工程作业-每周例行报告
    感谢Thunder团队
    第十周软件工程作业-每周例行报告
  • 原文地址:https://www.cnblogs.com/ccgjava/p/6394572.html
Copyright © 2011-2022 走看看