出处:【万卷文库】http://booox.blog.sohu.com/64469369.html
上次用weblogic 把 -XmxXXXX 设成2G,就启动不起来,设小点就起来了,当时很气,怎么2G都起不了,今天在看到了一篇解释,转过来了
这
次一位老友提出了这个问题,记得当年一个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下只有<2G的空间,所以JVM heap
使用极限是2G.用户的dll开始于0x77000000,用户的应用程序开始于0x00400000.我现在唯一确定的是sun可能为了防止和某些
JVM插件的冲突,把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第一虚拟机,只可惜不开源。
-----------------------------------------------------------------------------------------------------------------------------------
我在自己4G,操作系统为vista的笔记本上测试了一下
1、sun 2G模式
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode)
1586M。多1M都不行了
2、jrockit 2G模式
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
BEA JRockit(R) (build R27.5.0-110-94909-1.6.0_03-20080204-1558-windows-ia32, com
piled mode)
1880M
分享到:
相关推荐
标题中的“进程内存修改器”是指一种工具,它允许用户修改正在运行的进程中的内存数据。这类工具在游戏修改、软件调试或者性能优化等领域有一定的应用。通过对内存的直接操作,可以改变程序内部的状态,比如在游戏里...
本文主要探讨了如何使用Java来实现这一目标,特别是在一个Java虚拟机(JVM)中监控另一个JVM的内存和CPU使用状况。这种方法尤其适用于在职场环境中进行程序性能测试和比较。 首先,解决问题的限制和条件明确指出,...
了解这两个命令后,我们可以通过分析这些数值来评估Java进程的性能。如果上下文切换次数过高,可能意味着以下问题: - **线程竞争**:过多的线程在争抢CPU时间片,导致频繁的上下文切换。 - **I/O等待**:进程经常...
三个子进程一个 是生产者进程, 两个是消费者进行, 父子进程都使用父进程创建的共享存储区进 行通信, 由生产者进程将一个数组中的十个数值发送到由 5 个缓冲区组成的共享 内存中,两个消费者进程轮流接收并...
errorCompoundVariable.java 错误使用局部变量示例 factorial.java 求阶乘 Fibonacci.java 求Fiblnacci数列 GcdAndGcm.java 求最大公约数和最小公倍数 errorInit.java 演示变量初始化错误的程序 integer...
在Java编程环境中,有时我们需要利用高级的图形处理能力来展示数据或进行复杂的可视化操作,而MATLAB是一款强大的数值计算和数据分析软件,其图形绘制功能尤为出色。为了在Java项目中利用MATLAB的绘图功能,我们可以...
5. **进程所占用的CPU时间**:记录了进程自创建以来使用CPU的总时间,用于计算CPU利用率和调度策略。 6. **进程状态**:包括新建、就绪、运行、阻塞和结束等多种状态,反映了进程在生命周期中的活动情况。 7. **...
1. 观察系统负载:使用`top`或`htop`命令查看当前的系统负载和内存使用情况,找出占用内存最多的进程,并考虑优化这些进程。 2. 调整内存分配策略:通过调整 `/etc/sysctl.conf` 文件中的 `vm.swappiness` 参数,...
2. **信号量(Semaphore)**:用于解决资源争用和同步问题,可以看作是计数器,当计数值为0时,其他试图获取资源的进程会被阻塞。 3. **消息队列(Message Queue)**:存储结构化的消息,进程可以发送和接收消息,...
处理器具有许多寄存器 —— 常快速的内存元素,用作被执行的计算的工作存储,寄存器大小决定了一次计算可使用的最大数值。处理器通过内存总线连接到物理内存。物理地址(处理器用于索引物理RAM的地址)的大小限制了...
2. **进程优先数(PRIORITY)**:数值越大,进程的优先级越高。这在某些调度算法中会作为选择下一个执行进程的依据。 3. **进程已占用时间片(CPUTIME)**:记录进程已经使用了多少个时间片,每次被调度时,这个值会...
在进行Java应用程序开发时,MyEclipse作为一款强大的集成开发环境(IDE),有时会因为处理大量项目、编译代码或运行复杂应用时消耗过多内存,从而导致“内存不足”(Out of Memory)的问题。这个问题是许多开发者在...
- **内存管理**:理解Java虚拟机的内存管理机制,如垃圾回收、堆内存调整等。 ### 十一、Servlets & Servers(Servlet与服务器) - **Servlet基础**:学习如何使用Servlet处理HTTP请求,包括初始化参数、过滤器等。...
三个子进程一个 是生产者进程, 两个是消费者进行, 父子进程都使用父进程创建的共享存储区进 行通信, 由生产者进程将一个数组中的十个数值发送到由 5 个缓冲区组成的共享 内存中,两个消费者进程轮流接收并...
本资源摘要信息涵盖 Java 面试的多个方面,包括 Java 的基础知识、对象的创建和使用、关键字解释、反射机制、基本数据类型、字符串操作、Servlet 生命周期等。 一、Java 面试 100 题 Java 面试 100 题涵盖了 Java ...
例如,-XX:+AllowUserSignalHandlers允许在Linux和Solaris系统上为Java进程安装信号处理器,而-XX:-AllowUserSignalHandlers则禁止此行为。 2. -XX:<option>=<number>: 这种形式的选项用于设置数值类型的参数,可以...
- 在不需要对象特性的场景下使用基本类型,比如在简单的数值运算中。 - 对于集合类操作或需要引用计数的对象,使用包装类型。 #### 七、谨慎使用synchronized关键字 同步是多线程编程中的关键概念之一,但它也可能...
Servlet与CGI的区别在于Servlet处于服务器进程中,使用多线程方式运行其service方法。 七、ArrayList、Vector、LinkedList的存储性能和特性 ArrayList和Vector都是使用数组方式存储数据,LinkedList使用双向链表...
- 对于简单的数值计算等操作,推荐使用基本类型,以减少内存消耗和提高性能。 #### 七、谨慎使用`synchronized` - **问题**:同步会导致额外的性能开销,并可能引起死锁。 - **解决方案**: - 只在确实需要时使用...