Java程序运行时,数据都保存到什么地方?

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

寄存器

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

堆栈

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

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

静态存储

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

常数存储

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

非RAM 存储

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

原文地址:https://blog.51cto.com/14512197/2441853

时间: 2024-10-13 14:34:56

Java程序运行时,数据都保存到什么地方?的相关文章

Java程序猿之数据运算和运算符

Java是一门强类型语言,强类型语言包含两方面的含义:1.所有变量必须先声明.后使用:2.指定类型的变量只能接受类型与之匹配的值. 基本类型大致分为两种:数值类型和布尔类型,其中数值类型包括:整形.字符型.浮点型.所有数值类型直接可以进行类型转换,这种类型转换包括自动类型转换和强制类型转换. Java语言中的空格包含空格符(Space).制表符(Tab)和回车符(Enter)等. 标识符规则:标识符就是用于给程序中变量.类.方法命名的符号.Java语言的标识符必须以字母.下划线(_).美元符($

解决IntelliJ IDEA控制台乱码问题[包含程序运行时的log4j日志以及tomcat日志乱码]

这里使用的IntelliJ IDEA版本为[IntelliJ IDEA 14.1.4]: 一.控制台打印的程序运行时的log4j日志中包含中文乱码 在IDEA安装目录的bin目录下找到名为"idea.exe.vmoptions"的文件: 使用文本编译软件(Notepad++等)打开此文件,在文件内容从末尾追加一行设置(-Dfile.encoding=UTF-8),表示指定编码为UTF-8: 重启IDEA,再次测试,log4j日志不再乱码: 但是发现tomcat启动日志乱码了(修改IDE

使用Mono打造轻量级的.NET程序运行时

??在使用Mono让.NET程序跨平台运行这篇文章中,我们已经对Mono以及.NET程序的运行机制有了初步的理解.今天我想来谈谈"使用Mono打造轻量级的.NET运行时"这样一个话题.为什么我会有这样一种想法呢?因为Mono和.NET都可以执行IL代码,所以我用Mono来作为.NET程序的运行时是一个顺理成章的想法.由于.NET程序需要.NET Framework提供运行支持,所以当目标设备没有安装.NET Framework或者.NET Framework版本不对的时候,我们的程序都

Java程序员新手老手都离不开八大开发工具

现在有很多库.实用工具和程序任Java开发人员选择.每个工具都有其优点,但其中有一些因它的知名度.多功能性和有效性从众多选项中脱颖而出.    以下这8个工具,从代码构建到错误挤压,覆盖Java开发的全域.学习这些工具可以帮助你改善代码质量,成为一个更高效的Java开发人员.一.Eclipse    尽管IntelliJ IDEA.NetBeans和一些其他的IDE正在日益普及,但是有调查表明,Eclipse仍然是几乎半数Java开发人员首选的开发环境.Eclipse是IDE领域的瑞士军刀,有着

Java程序运行时数据存储位置

寄存器: 这是最快的存储区, 但是寄存器的数量极其有限, 所以寄存器根据需求进行分配, 而且不能直接控制. 堆栈: 位于通用的RAM(随机访问存储器), Java系统必须知道存储在堆栈内所有项的确切生命周期, 以便上下移动堆栈指针. 这一约束限制了程序的灵活性,所以虽然某些Java数据存储于堆栈中, 特别是对象的引用, 但是Java对象并不存储于其中. 堆: 一种通用的内存池(也位于RAM区), 用于存放所有的Java对象. 堆不同于堆栈的好处是编译器不需要知道存储的数据在堆里存活多久. 常量存

程序运行时的ds cs

程序 assume cs:code,ds:data data segment db 'unix' db 'fork' data ends code segment start: mov al,'a'mov bl ,'b'mov ax,4c00hint 21h code endsend start ———————————————————————————————————————————————— debug结果 Microsoft Windows [Version 6.1.7601]Copyrigh

linux下Java程序插入DB数据中文乱码问题

首先,插入到DB的数据,在Linux下查询的时候,字段显示为??. 再次,在windows连接到db上,查看的结果并不是乱码. 修改Eclipse软件中的编码:如上图:windows菜单->preference->general->content type,Javaclassfile和text都设成utf-8: 然后 在Linux下执行以下的命令: mysql> set names UTF8; 最后,在查询的时候,Linux下的内容,就不是乱码了.

解决qt程序运行时的cannot create Qt for Embedded Linux data directory: /tmp/qtembedded-0

方法1: 1.mkdir /tmp 2.挂载 mount -t tmpfs -o size=32m none /tmp 方法2: 上面的user 0h说明你是以root用户的身份运行.可以尝试切换一下用户重新运行试试 方法3: 把/tmp下的数据文件qtembedded-0删除在运行.

程序运行时 0xC0000005: 读取位置 0x00000000 时发生访问冲突 ,可能是 com 组件引入各种问题

在使用com组件事,可能引入很多不是问题的问题,比如CString 定义出运行时出错等等,这些问题解决的办法就是初始化组件 然后释放组件, 在使用组件时,如果仅仅用在按钮事件或者别的mfc 对话框类里面 可以正常使用,但是用到界面线程,而界面线程函数里面调用了函数com 组件的函数,必须初始化.不然就是上面错误 ::CoInitialize(NULL); 组件初始化函数 ::CoUninitialize(); 组件释放函数