JAVA数据结构存储剖析

2024-04-29

JAVA数据结构存储剖析(共7篇)

篇1:JAVA数据结构存储剖析

JAVA数据结构存储剖析

实用举例:

1:堆栈(stack)

方法的参数值

public void sun(int a , int b)

//调用方法是在栈内存中为参数分配存储空间,方法结束自动释放。

局部变量

public static void main(String[] args){int a = 5;}

//在方法中的局部变量,存储在栈内存中,方法结束时候,释放内存

引用变量

Person p = new Person(“zhaoyue”, 22);

//调用构造方法的时候,“形参”先在堆栈中开辟内存,存放“实参”,再把“实参”的//一份拷贝传入对象之中。此时,“实参”的拷贝存放在堆(heap)中,构造方法结束,//堆栈中的内存释放。

堆栈的存储要领:压栈,出栈,自动清除!

2:堆(heap)

成员变量

public class Person{ String name;int age;}

// New 的时候存储在堆中。

new得到的对象

Person p = new Person(“zhaoyue”, 22);

// New 的时候存储在堆中。

3:数据区(Data segment)

3.1:静态存储(static storage)

静态变量

public static int a = 5;

//JVM运行时首先为其开辟空间,位置不变,程序运行结束时空间释放。并且在运行时只加载一次。

静态方法

public static void run(){print(“hello”);}

//JVM运行时首先为其开辟空间,位置不变,程序运行结束时空间释放。并且在运行时只加载一次。

3.2地址池(address pool)

非new的字符串

String s = “hello world”;

3.3常量存储(constant storage)

常量

public final int a = 5;

4:Code segment(代码区)

4.1:Code segment

存放代码

4.2:方法区(method area)

成员方法

Public void run(){System.out.println(“I’m run!”);}

//类装载的时候存储在方法区,初始时被隐藏,实例化对象时被激活。

具体解释:

在java中有6中存取机制:

1: 寄存器(register)

2: 堆栈(stack)

3: 堆(heap)

4: 静态存储(static storage)

5: 常量存储(constant storage)

6: 非RAM存储寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。堆栈(stack):位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其中。堆(heap):一种通用性的内存池(也存在于RAM中),用于存放所有的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时

间。

4: 静态存储(static storage):这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的,但JAVA对象本身从来不会存放在静态存储空间里。

5: 常量存储(constant storage):常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中

6: 非RAM存储:如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。

速度:

就速度来说,有如下关系:

寄存器 > 堆栈 > 堆 > 其他

关系:

然后我主要要说下堆与堆栈的关系:

堆:堆是heap,是所谓的动态内存,其中的内存在不需要时可以回收,以分配给新的内存请求,其内存中的数据是无序的,即先分配的和随后分配的内存并没有什么必然的位置关系,释放时也可以没有先后顺序。一般由使用者自由分配,在C语言中malloc分配的就是堆,需要手动释放。

堆栈:就是stack。实际上是只有一个出入口的队列,即后进先出(frist in , last out),先分配的内存必定后释放。一般由,由系统自动分配,存放函数的参数值,局部变量等,自动清除。

还有,堆是全局的,堆栈是每个函数进入的时候分一小块,函数返回的时候就释放了,静态和全局变量,new得到的变量,都放在堆中,局部变量放在堆栈中,所以函数返回,局部变量就全没了。

JAVA中的基本类型,其实需要特殊对待。因为,在JAVA中,通过new创建的对象存储在“堆”中,所以用new 创建一个小的、简单的变量,如基本类型等,往往不是很有效。因此,在JAVA中,对于这些类型,采用了与C、C++相同的方法。也就是说,不用new 来创建,而是创建一个并非是“引用”的“自动”变量。这个变量拥有它的“值”,并置于堆栈中,因此更高效。

再说一说类的实例方法!

类的实例方法在内存中是只有一份,不过肯定不会是第一个对象中,如果是第一个对象的话,那么当第一个对象被销毁的时候,那么后面的对象就永远无法调用了。

类的实例方法存在一个专门的区叫方法区(method area),事实上类刚装载的时候就被装载好了,不过它们在“睡眠”,只是这些方法必须当有对象产生的时候才会“苏醒”.(比如,一个输出类的成员变量的方法,如果连对象都没有,何来的输出成员变量).所以,方法在装载的时候就有了,但是不可用,因为它没有指象任何一个对象。

而静态的又不一样了,静态的东西存在静态存储(static storage)区,他们和类是一个等级的,就是说只要类被装载,它们就可以直接用.(用类名来调用).他们不依赖与任何对象,所以也不能输出任何对象的成员属性.(除非成员属性也是静态的).每个对象在new的时候都会在堆区中开辟内存,用来保存对象的属性和方法.(实际上方法保存的只是方法区的引用,如果保存的是方法本身,那么试想一下,有多少个对象就得有多少个方法,那么又和第一点中“实例方法在内存中只有一份拷贝”相矛盾了。另外我补充一点,在父类的引用指向子类对象的时候,父类可以调用子类从父类继承的属性和方法,子类覆写父类的属性和方法,在动态绑定(也就是多态)时,子类对象有一个方法区得引用,动态new的时候这个引用指向子类的方法,从而实现了父类可以调用子类覆写父类的方法。这也是动态绑定得名的原因。)

如果您认真看完这篇文章,估计java中内存方面肯定会有所帮助,这篇文章是我总结归纳出来的,并非完全自己写的。有什么不对的地方,欢迎批评指正。

篇2:JAVA数据结构存储剖析

一、需求分析

财务部门是企业开展信息化较早的部门,很多企业在实施会计电算化取得成功后,逐步将企业的信息化推向供应链、人力资源等系统。由于企业财务信息化起步早,积累了很多的数据,这些数据分散在服务器PC机和笔记本中,因为用户过于分散及管理工作过于琐碎等原因,从而疏忽了对这些机器上的数据管理,给数据的长久保存带来很大困难。财政部门在会计电算化基础工作规范中特别对企业财务数据的保存提出了要求,要求保存在较好的存储介质上,以延长数据的保存时间。同时,企业财务部门的PC由于经常使用来自不同渠道的移动存储设备(如U盘、移动硬盘等),增加了被病毒感染的机率。2007年初爆发的“熊猫烧香”病毒就给很多企业的财务数据造成巨大损失,所以对企业的财务数据进行及时备份尤为重要。

? Synology网络存储服务器作为高性能的网络存储器,在对局域网上的用户提供文件共享服务的同时,可以方便的实现对PC机和笔记本的数据备份及恢复,为财务工作环境中的PC机及笔记本电脑的数据提供了强大存储及备份功能。

二、方案介绍

Synology网络存储器安装很简单,只需将存储器接入局域网交换机,安装Synology Data Replicator 软件就可投入使用。网络连接具体看下图:

Synology服务器提供了以下备份方案:

1.通过本地备份功能,管理者可以将Synology服务器的数据备份到外接式的USB或SATA磁盘上。

2.通过网络备份功能,管理者可以将一台Synology服务器上的资料备份到另一台Synology服务器上。

3.将PC端的数据备份到Synology服务器,达到保护数据的目的。通过Synology Data Replicator,使用者可以: 1.监视使用者计算机上指定的数据夹,将所有的变动的数据实时备份Synology服务器。2.设立档案上传的版本数目及还原点数目。3.日后根据需要将备份到Synology服务器上的数据恢复到使用者的计算机。

4.管理者也可以备份服务器的使用者、群组、共享数据夹设定。可以将一台外接式的USB磁盘连接至Synology服务器的USB端口上,或将一台外接式SATA磁盘连接至Synology服务器的e-SATA端口上。

5、增量备份的功能,Synology网络存储服务器不用象一般的备份工具一样重复备份;增量备份起到节省硬盘空间的作用,让硬盘的空间可以充分的使用。

三、简便的管理

? Synology服务器还提供了以下功能:

1.通过因特网储存及分享档案

Windows使用者以及Mac使用者可以轻松在网络上分享数据。

1.使用FTP传输档案

您可以开启Synology服务器的FTP功能,设定流量管制及匿名登入,提供使用者通过网络上传或下载数据。若您有数据安全上的考虑,您亦可选择含有FTP over SSL 或是FTP over TLS 功能的存储器。

3、外壳上的「Copy」按钮只需您按动一下,就能及时将数码相机、U盘、移动硬盘的资料复制到Synology服务器上。

4、分享USB打印机

您可以将Synology网络存储服务器当作打印服务器使用,将带USB接口的打印机接入Synology网络存储服务器,普通的打印机就成为一台人人都可以使用的网络打印机。

四、应用效果

企业财务数据备份是非常重要的事情,是不容忽视的。Synology网络存储服务器数据备份非常完整且自动完成,总是在您不注意的情况下就做完了。各项完整的备份方案让您可以找到适合的备份方式。

Synology产品以节省能源的设计概念出发,相对于服务器类产品,Synology产品设计小巧,消耗较少能源,因此能够同时为您节省电费,又能保护我们的地球,同时能为企业财务数据的长久保存提供有力的帮助。

附:网络存储服务器简介

篇3:JAVA数据结构存储剖析

一、网络数据存储

现阶段, 网络数据存储的方式主要由开放系统的直连式存储DAS (Direct-Attached Storage, 简称DAS) 中产生, 其中包括网络附加存储NAS (Network Attached Storage) 和存储区域网络SAN (Storage Area Network) 。

网络附加存储NAS是对网络文件进行存储和备份的专业设备。核心处理器、文件服务管理工具以及硬盘驱动器在每个NAS中都必备。存储区域网络SAN是把数据存储作为重点, 利用网络拓扑结构的伸缩性, 使用高传输速率的光通道进行快速连接, 交换内部数据, 实现存储区域网内部数据的独立管理, 可以同时操作多个系统, 实现数据共享的最大化和管理的最优化。

二、网络数据存储的安全与传输问题

目前, 我国计算机网络运行中, 进行访问控制时, 普遍采取静态密码认证的方式, 但是这种对用户的真实性的低级认存在着较大的问题和弱点。经调查发现, 大部分系统遭到攻击和突破时, 都是通过破解用户的静态密码的方式。还有一些相关管理人员缺乏良好的职业素养和道德品质, 滥用手中的职权, 窥探他人信息。

三、相应的解决策略

(一) 有效加密和数字签名

应对数据链的路层、传输层以及应用层这三层进行有效地加密, 进一步加强对信息传输的保护。利用加密算法和证实协议进行数字签名, 在确保发送者发送数据准确的情况下, 实现数据的有效接收。

(二) 发挥防火墙的重要作用

防火墙能够将网络内外的信息和运行状况更好的反映出来, 进而在网络数据传输过程中, 有效地提高网络安全。

(三) 基于PKI的认证

使用公开密钥体系, 也就是公钥基础设施PKI (Public Key Infrastructure) 认证系统进行加密, 安全性和有效率更高。

(四) 存储备份策略

1.完全备份 (full backup)

完全备份 (full backup) 是指每天都进行系统完全备份。能够在系统中的数据丢失的情况下, 利用前一天的备份磁带直接进行恢复。缺点是每天都进行系统的完全备份, 将会使磁带空间的占有率被提高, 加大用户成本。并且完整备份需花费用户的很多时间。

2.增量备份 (incremental backup)

增量备份 (incremental backup) 是指在每个星期的其中一天对系统做完全备份, 之后六天中的每一天都仅进行当天备份。这样大大降低了磁带空间的占有率, 用户也不必花费过多的时间在备份上。缺点是一旦发生数据丢失的情况, 想要恢复数据就要进行较为复杂的操作。由于增量备份使各盘磁带间形成生物链式紧密联系, 就会导致备份的数据不够可靠。

3.差分备份 (differential backup)

差分备份 (differential backup) 是指在每个星期中的其中一天对整个系统进行完全备份, 之后六天的每一天只是将当天与完整备份那天有差别的数据在磁盘空间中, 进行有效地备份。因此, 对系统进行有效地差别备份, 不需要每天进行系统的完全备份, 大大缩短了备份时间, 有效地为用户节约了磁带空间。一旦发生系统数据丢失现象, 不需要复杂的恢复过程。系统管理员只需要利用完全备份磁带和数据丢失前一天的磁带, 就能够轻松恢复系统数据。

在实际备份操作过程中, 可以有效的将完全备份、增量备份以及差别备份有机结合起来, 这样增加了备份的安全性, 使用起来最为保险。

(五) 虚拟专用网络 (VPN) 技术

虚拟专用网络 (VPN:Virtual Private Network) 技术能够将分布在不同地方的专用网络的安全通信在不可信任的公共网络上有效地进行。VPN技术对信息传输进行加密是通过复杂的算法实现的, 加密方案较为清晰, 是数据更加完整, 保密性更强。VPN技术能够为用户在公共网络上进行双向通讯提供可靠的保障。利用虚拟专用网络 (VPN) 技术, 首先应确保被保护主机能够有效地与公共网络的VPN设备相连, 连接后VPN设备将以预先设置为依据, 对需要加密的数据包进行有效加密和数字签名, 形成新的数据报头, 利用虚拟通道将数据传输到目标VPN设备, 解封并核实后进行解密。

结语

随着计算机网络技术的普及, 我国军队建设和发展过程中对其应用已经越来越广泛, 为了我国军事发展的安全性, 必须加强网络数据存储的安全和传输问题的探究, 并且从我国国情出发, 针对不同问题, 采取不同的解决策略, 有效地保护数据安全, 进而促进我国安全、稳定的发展。

参考文献

[1]刘瑾.北京邮储代发工资加密系统的设计与实现[D].北京邮电大学, 2010.

[2]张奕, 赛孚耐.三套方案应对云安全[N].计算机世界, 2010.

篇4:云存储技术现状剖析

关键词:云存储技术 现状 剖析

随着智能手机、笔记本、平板电脑、个人PC、智能相机或网络电视等IT设备的日益普及,如何对其中的重要数据进行妥善保存和备份,是当今许多部门或个人所必须面临的一个重要而现实的问题。

传统的数据备份办法存在着病毒威胁、硬件损坏、存储设备不稳定等诸多弊病和限制,更不能满足客户随时随地利用无线上网等方式上传输数据的要求。云存储技术正是迎合了绝大多数客户“安全、稳定、便捷”的第三方存储需求应运而生。无论何时何地,只要能够把设备连接上网,不管是有线的,还是无线的,都可以把重要的数据复制备份到仿若飘忽在你头顶的“云”里,这就是我们所说的“云存储。”

承担着最底层以服务形式收集、存储和处理数据任务的“云存储(Cloud Storage)”是“云计算(Cloud Computing)”的一大重要组成部分,各大IT企业、手机制造商、移动运行营商和操作系统开发商都争相在此基础上展开上层的云平台、云服务等业务。

一、云存储产业在国外的发展现状

1.国外几大主流的SSP及相关产品

从2008年出现云计算概念开始,紧随着云计算的步伐,SSP(云存储服务供应商)如:dropbox、微软的skydrive、Google Drive、苹果 iCloud、Box等就开始进入了大众视野。相关媒体2012年8月依据实际业务量统计显示,国外最具影响力的几大主流SSP正是上述罗列的几大公司及产品。

2.主要的云存储模式

目前的云存储模式主要有两种:一种是文件的大容量分享。有些SSP甚至号称无限容量,用户可以把数据文件保存在云存储空间里。另一种模式是云同步存储模式。例如dropbox,skydrive,谷歌的GDrive,还有苹果的iCloud等SSP提供的云同步存储业务。

3.云存储服务竞争惨烈,用户困惑并快乐着

尽管SSP提供的云存储服务类型基本相同,但它们的服务方向还是有些区别的,以国外的几大SSP云存储服务供应商为例:

Box主要面向企业用户,而非个人用户,因此Box的真正竞争对手应当是SharePoint,而苹果的iCloud仅面向iOS用户。

2012年4月,Google正式推出自主云存储服务Google Drive。一时间,业界对云存储服务之争开始热议纷纷。分析师认为,尽管Google Drive是针对个人用户,但它提供了足够多的企业功能,其中包括协作和文件同步服务,Google Drive势必将受到企业用户的欢迎。

虽然越来越多的智能手机及相机制造商、移动运营商、安卓系统开发商、甚至网络电视的生产商也纷纷推出了自己面向个人的云存储产品。但公众对其服务业务的恒久性及安全性仍存在疑虑。毕竟不论是商家,还是厂家,该项业务的盈利性才是其长存的根基。

云存储服务Box联合创始人阿隆·列维(Aaron Levie)曾经表示:“微软肯定最希望为尽可能多的Windows设备带来无缝数据传输服务,苹果同样希望确保iPhone、Mac和苹果电视保持同步。对于Google而言,除了核心搜索业务,它一直希望成为其客户的信息中心”。

二、国内云存储产业发展现状

1.市场发展迅猛

“云存储”作为一个备受热捧的新兴市场,在短短的几年时间里便在国内遍地开花。在我们身边能够看得到,用得着的“云”就有储115、金山网盘、腾讯中转、迅雷网盘,还有众多品牌的智能手机或网络电视机上的云存储。这是一块诱人的大蛋糕,而且前景广阔,众多商家都想从中分到一杯羹。

除了国内云存储业务迅猛发展的态势,更令人意想不到的是国内用户的热情。2012—2016年中国网络存储市场研究及未来发展趋势报告显示:到去年第一季度为止,国内某大型SSP的注册用户已突破三百万,其他几大SSP的注册用户数也不相上下。但是这些数字与现今近5亿的国内网民相比仍存在着巨大的发展空间。要知道,美国Dropbox头三年的客户数还不足百万,但现在已远超五百万了。

2.国内云存储产业面临的挑战

国内云产业尚处于起步阶段,市场的发展还不够成熟,面临的挑战还很多。国外影响力较大的SSP虽然只有少数几家,但客户和业务都比较稳定,商家可以定下心来稳定地开展各类长期业务。而国内的云存储市场刚刚起步,客户和SSP之间尚未进入稳定和互信的发展阶段,市场还不够成熟,客户和SSP的业务都还存在着诸多不稳定的状况。

三、云存储产业发展所面临的瓶颈

1.存储空间的安全性顾虑

目前,绝大部分企业或部门还不是很情愿地把单位的重要数据保存到“云”里去,究其原因还是对数据安全性的忧虑。而个人用户同样担心的是其隐私数据的泄露。

可以说,安全问题是对云存储服务的最大挑战。这一问题直接关系到云存储市场的生死存亡。从客户的角度分析,既然把重要数据交给第三方托管,自然希望SSP能够确保数据的不被篡改、不丢失、不被非法访问或任意窃取。而且上传和下载的速度不能太慢,最好能够提供实时高带宽的传输服务,这就给SSP们出了一道市场考题。

2.网络带宽的瓶颈

当我们保存备份重要数据的时候,当然都不希望太慢,也就是上传下载的速度要快,而且服务器要能及时接纳大量的数据流。这就对网速的分配、网络设备的性能和SSP的管理机制带来了极大挑战。毕竟作为云存储的客户,谁愿意为了备份一段录像而等待几十分钟的时间呢?

国内网络带宽的现状极大限制了用户对云存储的热情,对于国内的网速和价格,大家更是感同身受。

3.创作平台的限制

各大SSP云存储服务供应商都试图打造自己的垂直整合技术,但我们也注意到:随之而来的内容存储也就很难、甚至无法突破创作平台的限制。因此,各自为战的科技公司必然会带来一种断裂和碎片化的生态系统。

4.盈利魔咒

导致云存储行业竞争混乱的最根本因素是盈利模式的迷茫。云存储是一个很大的市场,也是很有潜力的市场,可以说,谁赢得云存储,谁就赢得未来。为了吸引更多的用户,云存储服务商必须提供更多的免费存储空间。但随着存储空间的增大,付费升级的用户就会减少。一些无其他收入来源的小型服务商势必将无法承担如此大的投入,它们不得不寻找其他的营收来源。SSP作为企业,它的最终目标就是盈利赚钱,而客户则希望获得更多、更好、低廉、甚至免费的服务。目前,企业只有采用增加广告,降低用户负担的方式了,至于其他的增值服务,目前也是处于开拓阶段,暂时还找不出更好的出路。

5.云存储技术的不确定性对市场的影响

海啸、地震等自然灾害或战争等人为因素会给云存储的发展带来众多不确定的因素,而在国内虽然不必过多担心战争等人为因素,但各方面的审核和对一些敏感内容的屏蔽等因素,也增加了云存储的时间成本和不确定性。

篇5:JAVA数据结构存储剖析

深入分析, 数据库应用性能的优劣性的根本标准是其提供信息的质量、数量以及速度, 并根据三者的数据所进行的一种成本效益分析。可以从三个方面进行重点分析, 用户使用应用系统进行数据的处理能不能达到其所需要的服务, 同时系统为用户提供的信息是否正确、精确、安全以及可靠, 此外, 应用系统的优良性, 还可以通过可读性的强度来表示。其次, 应用系统应当保证其处理信息的效率与适应能力, 而效率问题可以以应用系统在信息处理任务时, 对时间以及资源的消耗作为判断标准, 而适应能力则主要是针对系统对整个环境变化时的适应性为判断标准。数据库应用系统的这些要求之间并非独立存在, 在某种程度上来说, 相互之间是有一定制约性的。可以从以下几个方面进行具体介绍, 一是JAVA数据库的功能, 其是一种常用的数据处理工具。在数据处理过程中, 对ORCALE系统的功能影响较大;二是数据应用程序的提高, 其中主要涉及的是应用程序中的算法和数据结构, 同时保证数据结构访问的合理性, 并且也将对应用系统的相关性能进行影响;三是提高硬件的优越性, 以及保证网络支撑环境;四是在系统运行过程中, 要对数据库的运行进行及时维护。以上因素都能够在一定程度上, 对数据库的相关性能进行影响, 有些能够通过人工对这些因素进行控制, 有些则不能, 需要在开发人员在了解JAVA的基础之上, 对数据进行优化, 从而达到配置的优越性。

2 ORCALE中基于JAVA对象关系数据模型的建立与优化

数据库的开发应当建立在一定需求分析基础上, 在开发过程中, 对功能的安排, 以及数据流的控制, 应当尽可能以客观情况进行介绍。在客观描述的基础上, 对实体对象进行抽象分析, 从而分析出不同实体对象之间的关系。这种关系通过一定的方式成为ORCLE支持的结构模型。因为基于JAVA的ORCLE数据库系统的主要特性便是一关系为基础建立起来, 因此实体对象之间的关系模型, 在整个数据库设计中, 是非常重要的一个环节。当数据库建立以后, 这种关系模型已经形成, 但是在对该数据库逻辑结构设计的过程中还需要对关系数据模型进行随时检测, 对这些关系数据模型的调整与优化, 在很大程度上影响数据库系统在性能方面上的保持与提高。目前为止, 任何版本的DMS支持的数据模型都可以采用逻辑记录存取方法, 该方法目前位置是数据优化理论中的重要基础。在学界这种方法被简称为LRA方法。LRA方法以3个参数来对不同数据库性能进行比较, 或者说比较中最为核心的一个标准。该标准是指采用这种方法, 在单位时间能够存取多少记录, 即这些记录的总数, 从而根据数据的总数来确定存储的数据量, 并且对低数据存储空间进行分配。

3 ORCALE中基于JAVA对数据存储结构的调整

当数据开发还处于物理设计阶段时, 需要选择对象最为合适, 最能够对存储空间起到优化作用的分配方式, 此时则需要采用实现已经设定好了的逻辑数据模型, 为了实现这一目的, 应用开发人员应当在了解RDMS数据存数结构以及一些其他的存数方法的基础, 对这些存储结构的方法和数据存取结构的优缺点有着充分的了解, 并且分析存储介质以及应用化境特征。较好的结果是, 保证存储空间的高利用率以及高效率, 并且尽量减少数据存储机构在运行时的维护成本。ORCALE所提高的两种基本存储结构, 不仅能够使得顺序存储结构变长还能够使主码索引存储结构变长, 顺序结构的变长方式主要是根据逻辑数据模型而实现, 而主码索引存储结构的局促结构则主要是同自然连接的若干相关表完成, 而这些相关表, 需要时常通过自然连接操作实现。从检索速度上来看, 单表检索速度属于比较快的一类。多表自然连接操作的速度也十分快, 主要原因是磁盘内能够读入较多的有效数据, 因此, 在进行多表检索的过程中, 具有相同记录的局促结构, 将会实现物理空间上的相邻存储, 这主要是聚簇结构的影响。这便影响多表检索的速度。但是这种方式也使得聚簇结构的空间大大消耗。而ORCALE所支持的数据模型中, 还有一类同聚簇结构较为相象的结构类型, 即哈希簇存储结构, 这种存储结构的优点在于能够将一些在数据列上有共性的表, 集合在一起。。并且以这些共同数据列的相同之处, 作为索引的关键词, 然后在哈希函数的计算基础上, 得到哈希值, 最终确定相应数据的存储问题, 从而加快相关表的存储速度。

ORCALE的特征在于其数据库同表控件相联系, 是在表空间中的安放的, 而表空间则是在物理层面的数据文件当中。针对一些较为大型的数据应用来说, 要根据具体实际情况的应用, 通过较多数据的表空间, 使这些数据能够在多个数据文件中储存, 其有利之处便是在于能够减少信息之间资源的抢占, 发生I/O竞争的情况。从相同的道理进行分析, 如果表空间能够被安排到不同的数据问卷当中, 也能够大大减少I/O竞争。不管是从创建表空间的角度来看, 还是在创建数据表的角度来看, 在选择存储参数的过程中, 都要遵循按需分配的原则, 并且尽量做到一次到位。当在特定情况下对存储参数进行设置以及存储空间进行安排与分配时, 应当注意以下事项。第一, 注意单位时间内数据量的安排工作;第二, 观察一定时间内, 数据量是否发生变化;第三, 保证数据存留的时间;第四, 明确系统的存储时间。还需要注意的是, 对存储空间进行安排的过程中应当依据实际情况, 不能够过度使用缺省的存储参数设置。

4 ORACLE中基于JAVA数据查询与运行时的优化

数据库是否实现了设计的优化, 只要在数据库运行过程中, 才能够观察出来。在对数据库的优化进行观察的过程中, 则需要进入数据库的欲行阶段, 在设计好之后, 运行之前, 应当保证数据库的调试, 经过调试之后, 数据库便可以进行运行阶段。当数据库运行了一段时间之后, 通过对运行过程的经验总结, 相关人员可以在征得设计开发人员的相关建议下, 对数据库系统在运行过程中的实际情况进行分析, 从而得出数据库在运行过程中的优化之处可以从以下几个方面展开工作。

第一, 对数据库磁盘I/O进行优化, 可以采用的方式有四种, 一是将表与索引分离开来为二者建立表空间, 并且所建立的表空间应当被安置在不一样的磁盘上。二是采用不一样的磁盘, 保存日志或者回滚段。三是可执行文件与数据文件应当分开放置, 并且放置的磁盘应当不一。四是以表与索引的访问频繁度为标准将一些较常访问的表以及索引单独列出来, 存储在特定的磁盘上。

第二, 在对回滚段和重做日志进行优化的过程中, 也要找到一些方法, 较为常用的方法有三类, 一是对回滚段进行合理监测, 预防之间发生争用现象;二是对于动态的分配空间要尽量避免使用;三是通过一定的手段, 针对重做日志, 要尽量减少转储过程中的I/O争用现象。

第三, 针对全局区域中的系统进行整体的访问与优化, 从而使得数据之间的存入能够较为方便进行, 从而提高存储的速度。但是如果整个内存空间较小, 而不能够实现对全局区的保存, 可以对全局区的系统进行分解, 将其中的一部分放置在磁盘中。通过特定方式, 可以使得在数据读取的过程中, 能够大大降低数据读取的效率。因此在优化过程中, 对系统全局区的优化工作十分重要, 应该给予充分的重视。可以从以下几个方面对其内容进行分析。一是对缓冲区的高速缓存进行处理;二是通过一定的方式对日志缓冲区进行调整;三是对其他数据进行调整, 数据字典、共享池、游标数等等。

第四, 确定数据库的优化对象, 如对表存储参数进行优化、采用并行查询的方式、通过表的动态存储调整进行分配等等。第五, 对存储查询进行优化时, 还需要注重相应应用程序的建立, 可以通过建立索引、采用较为规范的SQL语句以及客户端设置的优化实现。

参考文献

[1]王红艳, 李涛.ORACLE数据库集群技术的具体实施[J].电脑知识与技术, 2011 (02) .

[2]张学义, 王观玉, 黄隽.基于Oralce数据库SQL查询优化研究[J].制造业自动化, 2011 (02) .

[3]韩东晋, 李晋.Java的昨天, 今天和明天[J].信息与电脑 (理论版) , 2011 (01) .

[4]李可可.浅析Oracle数据库的性能优化方法[J].硅谷, 2011 (02) .

[5]刘星.Oracle数据库的性能优化与调整[J].科技资讯, 2011 (04) .

[6]陈博.开发人员如何优化ORACLE执行语句[J].硅谷, 2011 (04) .

[7]刘潇.基于JAVA的五子棋游戏设计与实现[J].电脑知识与技术, 2011 (06) .

[8]王慧慧.Oracle体系结构研究[J].软件导刊, 2011 (04) .

[9]周岚, 孔鲲鹏.Oracle中基于Java的存储过程开发研究[J].巢湖学院学报, 2010 (06) .

篇6:JAVA数据结构存储剖析

1 final的使用

1.1 常量

这是final最普通的用法。对于某一数据如果在多处被使用,而且这个数据不允许被改变,那么使用final来声明一个常量是非常合适的。例如圆周率∏,如果在使用数字3.14之前就声明pulic final static double PI=3.14,那么当你写不同的函数来返回圆的周长、面积、体积等数学量时直接在表达式中使用PI即可,这样做的好处有:

1)增强代码的可读性。使用数字和使用有意义的单词显然后者更易被读懂。

2)避免了不必要的逻辑错误。如果在本来应该是3.14的地方被写成了3.24,那么返回的结果显然是错的,而使用常量则可避免这种错误,因为所有应该是3.14的地方都被PI代替了。即使PI被拼错了,编译器也能立即提示错误信息,这样不费吹灰之力就能将错误改正。

3)常量值改变时只需修改常量的定义而不用一处处的找出来修改。这里有一个值得注意的地方,如果在多个文件中都用到了同一个常量,那么涉及到的文件应该全部被重新编译,否则常量的修改只会在被重新编译过的文件中生效。具体原因是被final定义的常量都是在编译时被替换成具体值的,这一点应该重视,这也是常量区别于变量的一个地方,因为变量是在运行时被替换的。

1.2 方法域中的常变量

这种使用final的方法初看似乎很奇怪,但是如果恰当的使用这种方法,常常能起到意料之外的奇特效果。首先来看一下下面这个例子:

public static String test Method(final String subfix){

final String key=”prev”+subfix;

return key;

}

这是常变量的第一种用法,你希望在你的方法中有一个变量的值能够由传入的参数决定,但是你又希望这个变量一旦被赋值后在程序运行过程中就不允许被改变,那么常变量将是非常好的选择。使用这种方法的好处有:

1)避免了逻辑错误。试想,如果在方法中的某处你一不小心把本来不允许被改变的变量改变了,那么有可能你就要花费相当长的时间去找出这个bug,因为编译器是不会报错的。但是使用final限定这个变量后,一旦这个变量被初始化,它就不允许人为的改变,如果你真的改变了它的值,编译器会给出这样的错误提示:cannot assign a value to final variable。

2)不失灵活性。因为这样定义的常变量允许每次被调用的时候都被传入参数赋予不同的值,只是在运行阶段它的值不允许被改变而已。

另外还有一种更加灵活的方法,请看下面这段程序:

public void test Method(final String name){

final String msg;

if(name==null){msg=”parameter error!”;}

else{msg=”no problem!”;}

//假如你在这个地方篡改msg将会报错,

//例如msg=”error”,编译器会报错

System.println(msg);

}

这种方法的用法和前面的方法类似,只不过允许先不初始化final变量,等到合适的时候再赋值,一旦被赋值,变量的值就不允许再改变。

1.3 用final声明实例域中的数据成员

与方法域中的常变量类似,为了避免逻辑错误,可以在声明数据成员时增加final声明,这样如果不小心将赋值对象搞错,错误能快速的被编译器定位。请看这个例子:

public class test Class{

private final String creation=new String();

private String target=creation;

public void test Method(String modifcation){

if(modification==null){System.println(“error!”);}

else{creation=modification;}//本来是要给target赋值的,

//却赋给了creation,不过由于有final声明,编译器能报错,

//避免了不必要的时间浪费

}}

1.4 常量参数

就像前面举过的例子中,把传入参数都用final来限定,这种用法即所谓的常量参数。为了说明这种final使用方法的好处,我们先来看一个反面的例子:

public test Method(int input){

int result Input;

if(input<0)result Input=1;

if(input=0)input=2;//这里本来是要给result Input

//赋值的,结果错赋给了input

if(input>0)result Input=3;

}

本来是要根据input的值来决定result Input的取值,结果在第二个if判断后却将值错赋给了input导致第三个if语句的执行。当然这里只是为了说明情况,实际中情况往往比这复杂好几倍,到那时可能就要为这种低级错误付出惨痛的代价了。为了避免这种情况的发生,只需要很简单的一笔,即将第一行的声明改为public test Method(final int input)。

一旦传入的参数被声明为final那么参数的值在函数体中就不允许被改变。如果像上面这样的低级错误发生了,编译器会准确定位到这个错误并报错,这样一来就能节省下程序员很多宝贵的时间。

1.5 不可更改的集合对象

如果希望某一个集合对象是不可更改的,即初始化之后就不能对这个对象进行任何更改,那么可以考虑使用final来声明这个集合对象,例如final Set test Set=new Hash Set()。但是这样做所做到的只是对于test Set这个对象不能再更改,对于test Set中存储的数据集合仍然可以随意更改。请看下面这个例子:

public class transport{

private final static Set tran Set;

public transport(){

tran Set=new Hash Set();

tran Set.add(“bus”);//可以更改,不会报错

tran Set.add(“plane”);//可以更改,不会报错

tran Set.add(“bike”);//可以更改,不会报错

}

public void some Method(){

tran Set.add(“train”);//仍然可以更改,不会报错

tran Set=new Set();//不能更改,报错

}}

可以看出,使用final来声明集合对象仅仅能起到限制集合对象的作用,不能限制集合中的数据。想要限制集合中的数据,要用到Collections类的方法unmodifiable Set(Set exp)。对于上面的例子,只要修改一下构造函数transport()。

public transport(){

temp=new Hash Set();

temp.add(“bus”);//可以更改,不会报错

temp.add(“plane”);//可以更改,不会报错

temp.add(“bike”);//可以更改,不会报错

tran Set=Collections.unmodifiable Set(temp);

}

这样对于方法some Method()中的所有修改将会被限制,如果tran Set.add(“train”)被执行将会抛出一个Unsupported Operation Exception的异常。

1.6 用final声明不允许被继承的类

一旦某一个类被声明为final,那么以后任何其他的类都不能继承这个类。当然,为了达到类不被继承的目的还有一种隐式定义的方法,即将所有的构造函数都声明为private。为了说明问题,举这样两个例子,对于同一个类使用两种方法达到同一目的:

1)public final class object{//使用final声明类不允许被继承

float x,y;

public object()//构造函数为public

{x=0;y=0;}

}

2)public class object{//不使用final声明类

float x,y;

private object()//构造函数为private

{x=0;y=0;}

}

1.7 用final声明函数

使用final来声明不允许被继承的类固然达到了保护类的目的,但是大多数情况下我们只是希望类中的某些方法不允许被重载,从而达到保护类的完整性和安全性的目的。于是使用final来声明类内的方法将提供一种便捷的保护机制。这样以后被声明为final的函数将不允许被子类重载,因而避免了可能引起的非法操作。

2 结论

正确恰当的使用final对于Java程序员来说绝对是非常重要的技巧。大家都知道Java是一门对于程序员的经验和技巧要求都很高的语言,效率和安全性是需要程序员深思熟虑的问题。恰当的使用final将为我们省下宝贵的时间来优化程序的效率,同时为代码的安全稳健提供了保障。对于大型的项目来说逻辑错误绝对是一个不可忽视的问题,而final提供了一种将逻辑错误转换为编译错误的方法,从而减轻了查错的代价。因而让final成为一种编程规范也是合情合理的建议。

摘要:在Java语言的使用中,经常困扰程序员的一件事就是代码中的逻辑错误难以定位,从而降低了工作效率。final关键词的用法能在很大程度上解决这一类的问题,将逻辑错误转换为编译器能够识别的编译错误。在Java编程中将final作为一种规范将使整个项目变得更加便于管理,也更利于后期的测试和维护。

关键词:Java,final,逻辑错误,编译时替换,常量

参考文献

[1]Jr Simmons R.Hardcore Java[M].O'Reilly Media,Inc,2005.

[2]埃克尔.Java编程思想[M].陈昊鹏,译.北京:机械工业出版社,2007.

[3]孙卫琴.Java面向对象编程[M].北京:电子工业出版社,2006.

[4]昊斯特曼.Java核心技术[M].叶乃文,邝劲筠,杜永萍,译.北京:机械工业出版社,2007.

[5]梁著.Java语言程序设计基础篇[M].万波,译.北京:机械工业出版社,2008.

[6]高宏静.Java从入门到精通[M].北京:化学工业出版社,2009.

[7]庞永庆.21天学通Java[M].北京:电子工业出版社,2009.

篇7:JAVA数据结构存储剖析

目前, 随着面向对象编程思想的成熟, 面向对象的编程语言已占据了当前市场的主流。而C++语言和java语言作为面向对象程序语言的两大主力被广大编程技术人员的普遍使用, 这两种语言的相似之处当然是面向对象的种种共性比如:封装性, 继承性, 多态性等等。但是, 就内存的回收利用也就是常说的垃圾回收, 二者处理方式是有区别的。而且有一个潜在的编程陷阱, 往往有些C++程序员刚开始会误把java语言中的finalize () 方法当作C++中的析构函数。本文就有他们二者的异同之处做出剖析。

二、C++和java中的垃圾回收机制

C++程序语言设计的思想是:程序员要动态地管理内存资源, 以对象的形式使用指针, 程序员必须完成对内存的分配、使用和撤销, 语言自身不会提供帮助。这样设计的目的是使其不依赖于自动垃圾回收, 因为垃圾回收将有一个严重的空间和时间开销, 更有可能带来回收系统实现的复杂性和可移植性。此外, C++的一个设计目标是做许多底层工作, 而垃圾回收将使其不适合做这些工作。但垃圾回收机制, 可以简化设计, 消除许多程序底层引发错误的原因。垃圾回收机制能为用户带来极大的方便, 提供更可靠的存储管理模式[1]。

Java语言提供了自动垃圾收集机制, 换句话说, 程序员负责分配内存和使用, 不用的内存由语言自己撤销。Java的垃圾回收机制放在JVM (Java虚拟机) 里, JVM负责所有垃圾回收, 应用程序只需要在使用时申请空间, 而在撤销对象时不需要处理内存的回收问题。

由此可见, 如果设计成统一的自动垃圾回收系统则无法适用于各种不同的使用环境, 两种语言的垃圾回收机制各有其实现的方法。所以二者的选取无所谓好与坏, 应根据实际需要选择就够了。

三、垃圾回收过程

在C + + 语言中, 全部的对象都应该被销毁。 如果“C+ +”程序中在堆栈上创建了一个局部对象, 这个对象的销毁是基于“右花括号”该对象作用域结尾的地方。如果一个对象是用new关键词创建的, 当程序员调用操作符delete时, 将调用相应的析构函数, 如果程序员忘记调用delete运算符, 就永远不会调用析构函数, 这样就出现了内存泄漏的现象, 对象得不到清理, 而且这种缺陷也无法跟踪。因为这个原因, C++的标准库中设计了一种智能指针, 虽然有局限性, 但它可以解决内存泄漏的问题, 智能指针的标准库的定义格式::std::auto_ptr <>, 将指针包装为类, 然后重写反引用 (dereference) 操作符 (operator->*) 和成员选择操作符 (operator ->) , 来模仿指针的行为。其工作原理是:使用new运算符来构造一个对象并分配内存空间, 通过自动调用析构函数来清理这段内存。

相反, Java不允许建立本地对象, 须使用new建立对象, 在Java中, 也没有删除对象的 (delete) 运算符。因为垃圾收集功能会自动删除无用对象占用的内存空间。Java没有析构函数, 主要是因为有垃圾收集装置, 析构函数不能被垃圾收集装置完全代替, 因此, 有一种解决方案就是, 如果想进行除撤销内存之外的清理工作, 就只能调用java的某个方法, 这相当于使用析构函数, 但不方便[2]。

比如, 把C++堆比作房间, 其中的一个个对象都独自占据一个方格的空间。长时间过后, 对象有可能消失, 可是方格空间还需被占用。在java虚拟机中, 堆的体现形式不一样, 就像是传输东西的带子, 在分配新对象时, 它向前移动, 说明分配速度特别快。Java堆“指针”简单地转移到未分配的地方。其效率远远大于C++, 当然, 在实际工作中还一些有别的开销。

在实际工作中, Java堆工作不一定就像一个传送东西的带子。因为这将会导致频繁的内存分页, 所以会显得比实际需要的内存多, 页面调整会大大影响性能。这个解决方案是加个垃圾收集装置。当它工作时, 可以增加空间和使堆中对象有规律的排列, 通过这种方式, 堆栈指针可以非常容易地到达接近传送带的起始位置, 以避免错误页。重新布置垃圾回收装置对象, 实现速度快, 无限存储空间的堆模型。

现在, 很多Java虚拟机使用垃圾处理技术, 此技术是自适应控制技术。如何对找到的有用对象进行处理, 不同的java虚拟机会有不同的结果。有了块, 利用垃圾回收器就可以把对象复制到废弃的块里。每一块与相应的代数记录是否活着, 一般来说, 如果块被引用到其他地方, 将代数增加。垃圾回收器会对处理之后重新分布的块进行整理处理, 它有利于来处理大量的短暂的临时对象。在Java虚拟监控之下, 垃圾收集器将定期进行清理行动。如果所有的对象是非常稳定的, 但垃圾回收器的效率低, 就会切换到“标记-扫描”的模式。Java虚拟机会做“标记-清理”效果, 如果堆空间存在很多碎片[3], 将切换到“停止-复制模式”。 这就是所谓的“自适应”的技术。虚拟机中有很多附加的技术被用来提高速度, 特别是加载机的操作方面的, 叫做“即时” (JustIn-Time) 编译器技术。该技术可以将全部或部分的程序转换为本地机器代码, 从而提高程序运行速度。

四、C++中的析构函数和java中finalize () 方法的比较

4.1 C++中的析构函数。C++语言中利用构造函数和析构函数, 可以很好的自动分配和撤销资源。所以, 在构造函数中需要分配的资源申请完成, 已经分配的资源在析构函数被回收, 只要一个对象的生命周期结束, 资源的配置是自动被删掉。如果在自由存储区, 即“堆”中创建的对象, 而且被一个指针管理, 是必须借助指针的delete表达式显式的调用析构函数进行资源回收。

4.2 Java中的finalize方法。Java的堆是一个运行时数据区, 类的实例 (对象) 从中分配空间。Java虚拟机 (JVM) 的堆中储存着正在运行的应用程序所建立的所有对象, 这些对象通过new等指令建立, 但是它们不需要程序代码来显式地释放。一般来说, 堆的是由垃圾回收来负责的, 尽管JVM规范并不要求特殊的垃圾回收技术, 甚至根本就不需要垃圾回收, 但是由于内存的有限性, JVM在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术, 它自动地释放不再被程序引用的对象, 按照特定的垃圾收集算法来实现资源自动回收的功能[4]。在java在进行垃圾回收前, 会调用对象的finalize方法, 但是真正的垃圾回收则是在下一次垃圾回收动作发生时才进行的。finalize () 的实际作用是在垃圾回收器回收垃圾并释放内存前做一些重要的“清理工作”。对于任何给定对象, Java虚拟机最多只调用一次finalize方法。并且调用finalize方法的工作只需要交给JVM进行就可以了, 极少情况下需要手动调用该方法, 一般情况下不会显示地调用它, 因为这样可能会造成二次调用的情况, 当在第二次调用该方法时, 如果试图释放已经释放的内存时, 会抛出异常, “垃圾”回收工作则无法顺利进行。既然如此, 那么JVM会在何时调用finalize方法呢?一般而言, 只要程序没有在濒临内存空间不足的时候, JVM始终不会主动进行垃圾回收, 也就是说, 只有在程序内存快用完的那一刻, JVM才会主动去搜索已经不再使用的“垃圾”, 并及时对其进行清理工作。

4.3 二者的区别。Java finalize () 方法和c++的析构函数非常相似, 都是自动调用。然而, 二者调用时机不同, C++析构函数总是当对象超出范围时调用, 也就是说, C++析构函数的调用时间是一定的, 可以预知。可是, Java终止器只是当对象被破坏时, 该对象的finalize () 方法被调用, 当垃圾回收器准备删掉被对象占用的无用的内存空间, 它首先调用该对象的finalize () 方法, 然后将该对象的内存回收。但是对象什么时候被破坏, 应用程序是不通知的, 在大多数情况下, 在应用程序结束后, 该对象仍没有被销毁。

初识C++的程序员总会认为finalize方法其实就是C++中的析构函数, 但是这不对的, C++中, 调用了析构函数后, 对象一定会被销毁, 而Java中调用了finalize方法, 垃圾却不一定会被回收。因此得出的结论就是:对象可能不被垃圾回收;垃圾回收并不等于“析构”。

五、结语

Java语言和C++语言都是非常优秀的面向对象程序设计语言, 二者由于应用需求不同, 所以在垃圾回收机制上的设计有所区别, 但最终他们都可以实现垃圾回收, 内存再利用, 只是采用的方法不同而已, 只要编程人员弄清了他们的内因和区别, 按需选择, 实现起来就也就不是难事。

参考文献

[1]Bjarne Stroustrup.The Design and Evolution of C++[M].机械工业出版社, 2001.

[2]埃克尔, (Eckel, Bruce) .C++编程思想[M].机械工业出版社, 2002.

[3]埃克尔, (Eckel, Bruce) .Java编程思想[M].机械工业出版社, 2007.

上一篇:西汉铭文镜之 相思文化下一篇:湖南中医药大学赛