导航:首页 > 物理学科 > 堆空间占物理空间的多少钱

堆空间占物理空间的多少钱

发布时间:2022-09-13 01:30:09

1. 河北北大青鸟:增加java堆空间方法

在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32未Solaris操作系统(SPARC平台版本)上,默认的最大堆空间和起始堆空间大小为-Xms=3670K和-Xmx=64M。
对于64位操作系统,一般堆空间大小增加约30%。
但你使用Java1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分之一。
要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK1.5之后都支持)来查看,在VMSummary页面可以看到最大的堆大小。
用这种方法你可以根据你的程序的需要来改变堆内存大小,我强烈建议采用这种方法而不是默认值。
如果你的程序很大,有很多对象需要被创建的话,你可以用-Xmsand-Xmx这两个参数来改变堆内存的大小。
Xms表示起始的堆内存大小,Xmx表示最大的堆内存的大小。
另外有一个参数-Xmn,它表示newgeneration(后面会提到)的大小。
河北电脑培训http://www.kmbdqn.cn/认为有一件事你需要注意,你不能任意改变堆内存的大小,你只能在启动JVM时设定它。

2. 河南北大青鸟:增加java堆空间方法

在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32未Solaris操作系统(SPARC平台版本)上,默认的最大堆空间和起始堆空间大小为-Xms=3670K和-Xmx=64M。
对于64位操作系统,一般堆空间大小增加约30%。
但你使用Java1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分之一。
要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK1.5之后都支持)来查看,在VMSummary页面可以看到最大的堆大小。
用这种方法你可以根据你的程序的需要来改变堆内存大小,我强烈建议采用这种方法而不是默认值。
如果你的程序很大,有很多对象需要被创建的话,你可以用-Xmsand-Xmx这两个参数来改变堆内存的大小。
Xms表示起始的堆内存大小,Xmx表示最大的堆内存的大小。
另外有一个参数-Xmn,它表示newgeneration(后面会提到)的大小。
河南电脑培训http://www.kmbdqn.cn/认为有一件事你需要注意,你不能任意改变堆内存的大小,你只能在启动JVM时设定它。

3. 磁盘缓存,虚拟内存,页面文件,和物理内存的关系

如果它不存在,但是你能看见它 -- 它是虚拟的(IBM宣传虚拟内存之用语)。虚拟内存技术是计算机发展史上的一项重要的技术,它帮助应用程序摆脱了“体积”的限制。

记得上大学时,有一本书好像叫做“计算机网络 - 自顶向下”,全名记不太清了。书中从人们接触最多也最熟悉的“应用层”开始讲,一直讲到“物理层”,看完这本书后感觉效果不错。所以按照这种方法我也尝试着自上而下的去学习“虚存”,从我们最熟悉的C库接口调用说起,一直谈到底层的硬件支持设施。

1、初学者的疑惑
初学者往往都会写出以下这样的例子程序来学习malloc和free的使用。
int main() {
int *p = malloc(10000);
printf("p's address is 0x%p\n", p);
free(p);
return 0;
}
但往往结果让这些初学者们感到疑惑。比如上述的例子,在SUN SPARC 64编译后其输出如下:
p's address is 0x100100dc0
看到这样的结果,初学者往往心里嘀咕,“这台机器物理内存才4G,其地址空间总共才4294967296(dec),而0x100100dc0转换十进制为4296019392(dec),这个地址明显已经超出了我的物理内存的限制,这是怎么回事呢?”。其实这里的解释很简单:因为我们看到的都是“虚拟内存地址”。

2、“堆”为何物
malloc是个极其常见的内存分配接口函数,它主要负责运行时在“堆”上为程序动态分配内存空间。我们总是在口头上谈论着“堆”,那么“堆”到底为何物呢?我们已经知道了有“虚拟地址”这个东西的存在,想必“堆”和“虚拟地址”有着千丝万缕的联系^_^。我们来翻看一些经典书籍中的描述。在CS.APP[注1]中的描述是这样的:“堆是进程地址空间中的一段“虚拟地址”空间。在大多数的Unix系统中,堆是映射“二进制零区域(demand-zero)”实现的。其位置在bss段后,其增长方向为高地址方向”。

3、内存映射
前面谈到“demand-zero”这个新名词,那么什么叫“映射到demand-zero”呢?这里蕴含着一个极其重要的概念“内存映射”。内存映射好似一道桥梁,将放在物理磁盘上的对象和一段进程“虚拟地址”空间连接起来。磁盘上的对象,主要指的就是文件,在多数Unix的实现中支持两种文件的内存映射,分别为Regular File和匿名文件(如demand-zero)。映射的过程大致为将文件分成若干“虚拟内存基本单元(页)”大小存于“交换区”,直到CPU指令第一次访问到某个单元时,这个单元才真正被加载到物理内存中。

4、虚拟内存,何方神圣
看到这是不是有些“云里雾里”的感觉亚^_^。其实对于用户进程来说,它是看不到CPU和OS是如何相互配合完成内存管理的。它只认为它面前的是一个这样的情景:“一个完全被我拥有的CPU、一个从拥有M地址空间的物理内存(M = 2的n次方,n为地址总线宽度)...”。这里的用户进程眼中的“物理内存”实际就是“虚拟内存”。虚拟意味着假象,我们知道一个用户进程运行时可能仅仅占用的物理内存的一小部分。看来用户进程被欺骗了。而这个骗局是由操作系统和CPU共同布置的。为了让这个骗局一直维持下去,CPU和OS还是做了很多工作的,究竟有哪些工作呢?我们一一来看看。

1) 交换区(swap)
为了支持虚拟内存,操作系统在物理内存、磁盘之间交换数据的基本单元为“页”。页的大小是固定的,其因操作系统而异。这样一个用户进程在被加载之前首先要被分成若干个“页”,这些页存储在磁盘上。那么是不是进程启动后所有的页都被加载到物理内存中呢?答案是NO。在当前的Unix操作系统中,都有一个叫“交换区”的地方,“交换区”在磁盘上,它存储的是“已分配的虚拟内存页”。又有些糊涂是吧,什么叫已分配的页呢?一个进程虚拟内存页的加载流程大致是这样的:一旦用户进程一虚拟页需要被加载,则操作系统会在“交换区”中为该页分配一个页,一旦CPU访问的虚拟地址落入该页地址空间,则该页才被换入到物理内存中。在这个过程中虚拟页有多个状态,分别如下:
未分配的 - 进程虚拟页未得到加载指令,仍安静的待在磁盘上;
未缓存的 - OS为该进程虚拟页在交换区分配了一个空间,但是该虚拟页还未被引用;
已缓存的 - 该虚拟页被引用,被载入到物理内存中。

2) 换入换出
物理内存容量有限,当物理内存无空间存储新的内存页的时候,就需要将某些内存页从物理内存中移出以为新页腾出空间。这个过程对于那些被移出的页来说,就叫“换出”;相反对于那些新加入到物理内存中的页来说就叫做“换入”。

5、从缓存角度看虚存
现代计算机的存储体系是呈金字塔状的。越接近顶层,速度越快,容量越小,价格越贵;越接近底层,速度越慢,容量越大,价格越低。这样就形成了一个逐级缓存的机制。第K层设备永远是第K+1层设备的缓存。按照这种说法,在早期计算机中,主存是磁盘的缓存,CPU内的高级Cache是主存的缓存。现代计算机基本都支持虚拟内存机制,而虚存页是存储在磁盘上的,虚存页在主存中换入换出。按照缓存的概念,虚存属于容量大,速度慢的第K+1层,而处于第K层的主存就可以看作是虚拟内存的缓存。那么一切缓存理论就都可以应用在虚存和物理内存之间了,比如换入换出算法等。

6、硬件支持
在支持虚拟内存机制的计算机中,CPU都是以虚拟地址形式生成指令地址或者数据地址的,而这个虚拟地址对于物理内存来说是不可见的,那么是谁来屏蔽这个差异的呢?答案是MMU(Memory Management Unit)。MMU负责将CPU发出的虚拟地址转换成相应的物理内存地址。MMU不是孤立工作的,OS为其提供了很好的支持,OS在物理内存中为MMU维护着一张全局的页表,来帮助MMU找到正确地物理内存地址。

4. 广东北大青鸟:增加java堆空间方法

在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32未Solaris操作系统(SPARC平台版本)上,默认的最大堆空间和起始堆空间大小为-Xms=3670K和-Xmx=64M。
对于64位操作系统,一般堆空间大小增加约30%。
但你使用Java1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分之一。
要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK1.5之后都支持)来查看,在VMSummary页面可以看到最大的堆大小。
用这种方法你可以根据你的程序的需要来改变堆内存大小,我强烈建议采用这种方法而不是默认值。
如果你的程序很大,有很多对象需要被创建的话,你可以用-Xmsand-Xmx这两个参数来改变堆内存的大小。
Xms表示起始的堆内存大小,Xmx表示最大的堆内存的大小。
另外有一个参数-Xmn,它表示newgeneration(后面会提到)的大小。
广东电脑培训http://www.kmbdqn.cn/认为有一件事你需要注意,你不能任意改变堆内存的大小,你只能在启动JVM时设定它。

5. 江苏北大青鸟:增加java堆空间方法

在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32未Solaris操作系统(SPARC平台版本)上,默认的最大堆空间和起始堆空间大小为-Xms=3670K和-Xmx=64M。
对于64位操作系统,一般堆空间大小增加约30%。
但你使用Java1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分之一。
要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK1.5之后都支持)来查看,在VMSummary页面可以看到最大的堆大小。
用这种方法你可以根据你的程序的需要来改变堆内存大小,我强烈建议采用这种方法而不是默认值。
如果你的程序很大,有很多对象需要被创建的话,你可以用-Xmsand-Xmx这两个参数来改变堆内存的大小。
Xms表示起始的堆内存大小,Xmx表示最大的堆内存的大小。
另外有一个参数-Xmn,它表示newgeneration(后面会提到)的大小。
江苏电脑培训http://www.kmbdqn.cn/认为有一件事你需要注意,你不能任意改变堆内存的大小,你只能在启动JVM时设定它。

6. 堆的地址空间是多少到多少栈的地址空间是多少到多少怎么判断一个地址是在什么地方

我想没人能给出具体的值,针对不同系统,不同配置,不同设定,堆和栈地址及空间大小可能都是变化的,有的系统是操作系统本身提供的。要判断一个地址是在什么地方,首先需要知道堆栈的地址,PC较难获取这个信息,至于单片机,大致可以从编译信息的地址映像里面获知。

阅读全文

与堆空间占物理空间的多少钱相关的资料

热点内容
word中化学式的数字怎么打出来 浏览:798
乙酸乙酯化学式怎么算 浏览:1456
沈阳初中的数学是什么版本的 浏览:1421
华为手机家人共享如何查看地理位置 浏览:1111
一氧化碳还原氧化铝化学方程式怎么配平 浏览:949
数学c什么意思是什么意思是什么 浏览:1481
中考初中地理如何补 浏览:1367
360浏览器历史在哪里下载迅雷下载 浏览:761
数学奥数卡怎么办 浏览:1466
如何回答地理是什么 浏览:1090
win7如何删除电脑文件浏览历史 浏览:1113
大学物理实验干什么用的到 浏览:1552
二年级上册数学框框怎么填 浏览:1770
西安瑞禧生物科技有限公司怎么样 浏览:1215
武大的分析化学怎么样 浏览:1305
ige电化学发光偏高怎么办 浏览:1395
学而思初中英语和语文怎么样 浏览:1734
下列哪个水飞蓟素化学结构 浏览:1484
化学理学哪些专业好 浏览:1537
数学中的棱的意思是什么 浏览:1136