运行具有最大“最大堆大小”的Java应用程序

时间:2011-09-24 15:58:17

标签: java memory

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

    Windows中的
  • 使用cmd命令?
  • Linux中的
  • 使用sh命令?

我想将-Xmx值设置得尽可能大。

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


a linked answer to another question我学习了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 

如何自动检测安装了哪个操作系统和哪个Java? 好的,我可以默认为最小值 - 1470 MB。 但是我怎么能确定在较新版本的Java中这个值不会缩小呢?

对于64位Java,这个问题仍然存在。

3 个答案:

答案 0 :(得分:1)

尝试以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!

答案 1 :(得分:0)

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

  • 您正在使用的操作系统
  • 机器的拉杆尺寸
  • 正在运行的应用程序。或其他应用程序RAM使用

所以我可以建议尝试找到最大值。您的Java应用程序在大多数时间运行所需的堆大小。

如果你需要找到最大尺寸,这里是我听过或读到的事实

  • XP使用1 GB RAM
  • Vista / Seven使用至少2-3 GB以便顺利运行
  • 我认为Linux ram大小是1-2 GB

现在我们可以希望您的JAVA VM不会全时运行。因此,我们暂时可以忽略系统中运行的其他计算机。 所以你的RAM size - OS RAM size会给你所需的堆大小。

我建议您根据Java应用程序的要求决定堆大小。

答案 2 :(得分:0)

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

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

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

从理论上讲,32位进程可以处理高达4GigaBytes,64位进程可以处理多达16个异常(实际上大多数64位处理器不支持全部数量)。

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

OS /内核通常会保留一大块地址空间供自己使用。例如,默认情况下,Windows会保留2GB的地址空间(尽管有一个交换机会将此值减少到1GB)。 Linux内核通常会保留1GB(尽管内核更改可以减少到几乎没有)。

因此,对于Java VM,这将使Windows 32位为2GB,Linux 32位为3GB。考虑到JVM需要的内存不是Java Heap的一部分,因此您的堆必须比这些数量小一些 - 根据您的应用程序和JVM实现,它将有多大差异。