运行java应用程序时,最大值为;“最大堆大小”;可获得的

运行java应用程序时,最大值为;“最大堆大小”;可获得的,java,memory,Java,Memory,如何计算java应用程序可用的最大“最大堆大小” 在Windows中使用cmd命令 在Linux中使用sh命令 我想将-Xmx值设置得尽可能大 我想确保java不会抱怨-Xmx值太大 从中,我了解了32位Java的以下值: OS: Windows XP SP2, JVM: Sun 1.6.0_02, Max heap size: 1470 MB OS: Windows XP SP2, JVM: IBM 1.5, Max heap size: 1810 MB OS: Windows Serv

如何计算java应用程序可用的最大“最大堆大小”

  • 在Windows中使用
    cmd
    命令
  • 在Linux中使用
    sh
    命令
我想将-Xmx值设置得尽可能大

我想确保java不会抱怨-Xmx值太大


从中,我了解了32位Java的以下值:

OS: Windows XP SP2, JVM: Sun 1.6.0_02, Max heap size: 1470 MB OS: Windows XP SP2, JVM: IBM 1.5, Max heap size: 1810 MB OS: Windows Server 2003 SE, JVM: IBM 1.5, Max heap size: 1850 MB OS: Linux 2.6, JVM: IBM 1.5, Max heap size: 2750 MB 操作系统:Windows XP SP2,JVM:Sun 1.6.0_02,最大堆大小:1470 MB 操作系统:WindowsXPSP2,JVM:IBM1.5,最大堆大小:1810MB OS:WindowsServer2003SE,JVM:IBM1.5,最大堆大小:1850MB OS:Linux2.6,JVM:IBM1.5,最大堆大小:2750MB 如何自动检测安装了哪些操作系统和哪些Java? 好的,我可以默认为最小值-1470 MB。 但我如何确保在较新版本的Java中,该值不会缩小


对于64位Java,这个问题仍然没有答案。

这个问题永远不会得到直接的答案。在决定最大堆大小时有很多变量。在我的头顶上,我能想到:

  • 您正在使用的操作系统
  • 你机器的内存大小
  • 正在运行的应用程序。或其他应用程序的RAM使用情况
因此,我可以建议您尝试找到java应用程序在大多数时间运行所需的最大堆大小

不过,如果你需要找到最大尺寸,以下是我听说或读到的事实

  • XP使用1GB内存
  • Vista/Seven至少使用2-3 GB以实现平稳运行
  • 我认为Linux的ram大小大约是1-2GB
现在,我们希望您的JAVA虚拟机不会一直运行。因此,我们可以暂时忽略系统中运行的其他计算机。 因此,您的
RAM大小-OS-RAM大小将为您提供所需的堆大小


<强>我建议你根据你的java应用需求来决定堆大小。

> P>有很多事情要考虑。内存有两个实际限制,第一个是最大可寻址内存的限制,第二个是环境中可用的虚拟内存总量

1) 虚拟内存(通常)由RAM和交换空间(磁盘备份虚拟内存)组成。此内存池由计算机上运行的所有进程(包括操作系统)使用。使用的总内存必须小于总可用虚拟内存(尝试超过此限制将导致一个或多个进程出错)

2) 最大可寻址内存是每个进程对可映射到该进程的内存量的限制。某些进程内存映射可能保留给OS/内核。可用的主要因素是进程是32位还是64位。通常,64位进程不需要担心限制(但;),因为它非常高(尽管这取决于体系结构)

从理论上讲,32位进程最多可寻址4G字节,64位进程最多可寻址16EB字节(实际上,大多数64位处理器不支持全部容量)

让我们从现在开始谈论32位

操作系统/内核通常会保留一块地址空间供自己使用。例如,默认情况下Windows会保留2GB的地址空间(尽管有一个开关会将其减少到1GB)。Linux内核通常会保留1GB(尽管通过内核更改可以将其减少到几乎为零)


因此,这就为您的Java虚拟机在Windows 32位上留下了2GB,在Linux 32位上留下了3GB。考虑JavaM需要的一堆内存不是java堆的一部分,所以堆必须比这些量小一些——根据应用程序和JVM实现会有多少变化。

< P>尝试运行2千兆字节或内存的java,减少数量,重复到java运行。 Linux:

#!/bin/sh
let mem=2000
while [ 1 ]
do
    java "-Xmx"$mem"m" -version > /dev/null 2>&1
    if [ $? -eq 0 ]
    then
        break
    fi
    let mem=$mem-100
    if [ $mem -lt 100 ]
    then
        #// something went wrong with our test
        let mem=700
        break
    fi
done
echo $mem 
窗口:

@echo off
setlocal enabledelayedexpansion
set mem=2000
:decmem
set /a mem=mem-100
if !mem! == 0 (
    rem // something went wrong with our test
    set mem=700
    goto start
)
java -Xmx!mem!m -version > nul 2> nul
if errorlevel 1 goto decmem
:start
echo !mem!

是否相关?我建议将此作为副本关闭。如果你不同意,请在这里留下评论。@Hemal:我已经更新了我的问题。您的链接有帮助,但并不能解决问题。此外,在JVM上运行的服务器,其当前使用的Java堆不完全在RAM中(即不分页到磁盘),其性能不会很好。我的应用程序本身不需要太多内存,但用户用它打开的文件必须在内存中处理,这些文件的大小从1千字节到数百兆字节不等。@eye我的一个朋友已经完成了从文本文件读取数据并将其加载到Oracle数据库的逻辑。他在那里也有Gbs的数据。正如我记得的,他使用的逻辑与中的相似。可以使用更改新字节[1024]数组大小来配置程序。它改善了他的程序内存管理和阅读速度。希望如此helps@eye此外,64位操作系统需要更大的堆大小才能运行。但是有一些jvm设置具有32位操作系统的堆内存使用优势。如果您使用的是64位windows,请也搜索此文件。除了oracle或sun站点之外,还可以在IBM站点中找到它。