`
oml990nt
  • 浏览: 16107 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

java进程使用的最大内存的数值

 
阅读更多

java进程使用的最大内存的数值
2011年02月16日
  
http://guiqing85.javaeye.com/blog/582249
  这次一位老友提出了这个问题,记得当年一个java高手在blogjava提出后,被骂得半死。大家使用java -XmxXXXX -version版本得出了不同的结论。后来老友说大概是1800M左右,我当时反驳,“我设置过服务器8G内存,我使用两个tomcat,每个2G”。为此,我翻开所有的JVM的内存管理的c代码,没有任何结论。我不是linux内核程序员,但是我看过linux的源码,知道32位体系结构的计算机寻址空间是2^32=4G,intel Pentium Pro处理器寻址空间是36位,CPU内部增加了PAE寄存器。用于处理多出来的4根地址线的使用,所以PAE的技术实现最大2^36=64G寻址。通过linux的内核源码,标准Linux内核对于物理内存的管理采用1:3的分配比例,即物理内存的1/4为内核空间(kernel space),剩下的3/4为用户进程空间(user space),因此,在一台4G内存的服务器上,用户进程可使用的内存最大也就是3G。当进程被内核调入CPU运行时,不同的地址空间数据会被调入4G以内的用户进程空间,其实就能用3G。 IA32架构上,单一进程是不能使用超过4G的内存空间的。但是我记得我给mysql server分配内存大约是1.7G左右,不是2的32次方-1,我分配java 2G内存的计算机是IBM的RS6000.
  经过不同平台的测试,我得出了大概的数值,win2k下1.6G左右,nt下1.2G,原因是这样的,Classic VM and HotSpot VM 存放用户区的连续地址中,NT把 kernel DLLs 放在 0x7c 开头的地址空间,所以nt下只有冲突,把dll的地址给rebase一下,这样使用的空间就很少了一部分.为什末rebase,原因是这样的,因为在windows下编译 dll 的默认地址都是10000000, 一般在release之前的时候要rebase一下,rebase 的 -b 这个参数是指定一个起始地址,MSDN建议地址是0x60000000,这个工具随visual studio和platform SDK发放。
  例如
  rebase.exe -b 0x6D000000 \jdk\jre\bin\*.dll \jdk\jre\bin\hotspot\jvm.dll这样你的JVM用的内存多一些,目前关于这个我只能得到BEA的 JRockit最大也只能使用1.8G内存,看来各家编译JDK时都作了些手脚.
  目前只能得到bea的的-Xmx最小值是16 MB,sun的资料很不全,还好java开源了,可以不依靠sun了.
  sun提供的资料
  Maximum Address Space Per Process 
  Operating System                   Maximum Address Space Per Process
  Redhat Linux 32 bit                                      2 GB
  Redhat Linux  64 bit                                     3 GB
  Windows 98/2000/NT/Me/XP                                  2 GB
  Solaris x86 (32 bit)                                      4 GB
  Solaris 32 bit                                            4 GB
  Solaris 64 bit                                            Terabytes
  以上文档有误,32位的redhat Server利用 Highmem技术可以使用3G内存.
  solaris不愧是java的诞生平台。
  问了一下bea的工程师,得出大致的结论,
  Windows 2003/XP using the /3GB switch (32-bit OS)
  1.85 GB - JRockit 5.0 R25.2 (SP2)
  2.85 GB - JRockit 5.0 R26 (SP3)
  Windows 2003/XP x64 Edition with a 32-bit JVM (64-bit OS)
  2.05 GB - JRockit 5.0 R25.2 (SP2)
  3.85 GB - JRockit 5.0 R26 (SP3)
  对于windows 2000打开3G模式,windows核心编程说得很清楚,boot.ini加入/3G参数。
  [boot loader]
  timeout=30
  default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
  [operating systems]
  multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB
  Note: "????" in the previous example can be the programmatic name of any of the following operating system versions:
  Windows XP Professional
  Windows Server 2003
  Windows Server 2003, Enterprise Edition
  Windows Server 2003, Datacenter Edition
  Windows 2000 Advanced Server
  Windows 2000 Datacenter Server
  Windows NT Server 4.0, Enterprise Edition
  在我的机子测试一把,我的自己配置,1G内存,winXP
  没有打开3G模式,sun的jdk 1.6 java -Xmx1447M -version,揪出错了,jrockit-R27.1.0-jdk1.5.0_08为1911M,3G模式 sun的jdk没有变化,IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi3223-2006050
  4 (JIT enabled) 3G和2G相同,java -Xmx1787M -version 就出问题,jrockit-R27.1.0-jdk1.5.0_08为2899M,注意Xmx的内存不是物理内存,我的机子物理内存只有1G。
  jrockit不愧为java第一虚拟机,只可惜不开源。
  linux 可以寻址的最大内存
  Intel X86
  .最大CPU数: 32(包括逻辑CPU)
  .最大内存: 64GB
  .最大文件大小: 8TB
  .最大文件系统大小(ext3): 16TB
  .最大每个进程的虚拟地址空间: 4GB
  AMD 64/EM64T
  .最大CPU数: 64
  .最大内存: 128GB
  .最大文件大小: 8TB
  .最大文件系统大小(ext3): 16TB
  .最大每个进程的虚拟地址空间: N/A
  请注意上面是标准的最大限制, 请不要跟Linux集群系统混淆(能扩充到1024个CPU).
分享到:
评论

相关推荐

    Java实现的生产者与消费者问题

    三个子进程一个 是生产者进程, 两个是消费者进行, 父子进程都使用父进程创建的共享存储区进  行通信, 由生产者进程将一个数组中的十个数值发送到由 5 个缓冲区组成的共享 内存中,两个消费者进程轮流接收并...

    Java开发技术大全(500个源代码).

    errorCompoundVariable.java 错误使用局部变量示例 factorial.java 求阶乘 Fibonacci.java 求Fiblnacci数列 GcdAndGcm.java 求最大公约数和最小公倍数 errorInit.java 演示变量初始化错误的程序 integer...

    生产者消费者问题.zip

    三个子进程一个 是生产者进程, 两个是消费者进行, 父子进程都使用父进程创建的共享存储区进  行通信, 由生产者进程将一个数组中的十个数值发送到由 5 个缓冲区组成的共享 内存中,两个消费者进程轮流接收并...

    JAVA面试题最全集

    Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都...

    java 面试题 总结

    内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...

    java范例开发大全源代码

     实例154 使用静态成员变量计算内存中实例化的对象数目 239  实例155 实现加减乘除的方法 240  8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  ...

    java范例开发大全

    实例154 使用静态成员变量计算内存中实例化的对象数目 239 实例155 实现加减乘除的方法 240 8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂...

    Java范例开发大全 (源程序)

     实例154 使用静态成员变量计算内存中实例化的对象数目 239  实例155 实现加减乘除的方法 240  8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158...

    Java范例开发大全(全书源程序)

    实例154 使用静态成员变量计算内存中实例化的对象数目 239 实例155 实现加减乘除的方法 240 8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会...

    java面试题

    此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),...

    java范例开发大全(pdf&源码)

    实例154 使用静态成员变量计算内存中实例化的对象数目 239 实例155 实现加减乘除的方法 240 8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂...

    整理后java开发全套达内学习笔记(含练习)

    可使用java.io.InputStreamReader 例: import java.io.InputStreamReader; import java.io.BufferedReader; class n{ public static void main(String[] args){ System.out.println("请输入一列文字,包括空格...

    超级有影响力霸气的Java面试题大全文档

    内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...

    关于JAVA面试的100题及其答案

    从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 9、...

    Eclipse 启动运行速度调优

    <br>-Xmx96m - 此设置指定 Java 虚拟机应对堆使用的最大内存数量。为此数量设置上限表示 Java 进程消耗的内存数量不得超过可用的物理内存数量。对于具有更多内存的系统可以增加此限制,96 MB 设置有助于确保 ...

    Backend_Notes:Java访谈的笔记,我们可以访问https:cornprincess.github.ioBackend_Notes来阅读笔记。 中国游客可以浏览

    进程与线程 内存管理 文件系统 输入和输出 死锁 :cloud:网络协议 :floppy_disk:数据库 :postbox:消息数值 :tent:缓存 :globe_showing_Americas:分散 :watermelon:设计模式 创建型 行为型 结构型 :wrench:工具...

    oracle数据库笔记

    6.JAVA池 不小于20M 20 7.Streams池 20 8.软件代码区: 20 9.程序全局区(PGA) 20 四. 实例的进程结构(实例=SGA + 后台进程) 20 1.DBWR (数据库写入进程) 21 2.LGWR(日志写入进程) 22 3.ARCH(归档进程)-可选...

    Oracle9i的init.ora参数中文说明

    说明 : 指定在一个共享服务器环境中可同时运行的共享服务器进程的最大数量。 值范围: 根据操作系统而定。 默认值 : 20 dispatchers: 说明 : 为设置使用共享服务器的共享环境而设置调度程序的数量和类型。可以为该...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    4.2.6 Java池 149 4.2.7 流池 150 4.2.8 自动SGA内存管理 150 4.3 小结 151 第5章 Oracle进程 153 5.1 服务器进程 153 5.1.1 专用服务器连接 154 5.1.2 共享服务器连接 156 5.1.3 连接与会话 157 5.1.4 ...

Global site tag (gtag.js) - Google Analytics