2016-08-15 3 views
0

私はMac OS X El CapitanとUbuntu 16.04 LTSで動作している2台のコンピュータを持っています。どちらもJava SDK 1.8.0_101がインストールされています。Java on osx - xmxが無視されましたか?

私が利用できるより多くのメモリでのUbuntu上のゲームサーバを起動しようとすると、私は次のような出力が得られます。

$ java -Xms200G -Xmx200G -jar craftbukkit.jar nogui 
Loading libraries, please wait... 
:私はこのエラーを取得していないMac OSで

$ java -Xms200G -Xmx200G -jar craftbukkit.jar nogui 
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f9b6e580000, 71582613504, 0) failed; error='Cannot allocate memory' (errno=12) 
# 
# There is insufficient memory for the Java Runtime Environment to continue. 
# Native memory allocation (mmap) failed to map 71582613504 bytes for committing reserved memory. 
# An error report file with more information is saved as: 
# 

両方のコンピュータに8GBのメモリがあります。他のアップルコンピュータでも同じことを試みました。

これはjava macバージョンのバグですか?

(1ギガバイトに例えばメモリ使用量を制限する強制する方法はありますか?-Xmx1Gは動作しませんし、私は別の理由を見つけることができませんでした。ここではありませんどちらもグーグルに)

ありがとうございました!

私の悪い英語のために申し訳ありません...

+3

linuxには「固定」スワップの概念があります。メモリの容量は物理RAM +スワップファイルに基づいています。 OSXは必要に応じてスワップファイルを追加し続けるだけです(ディスク領域がなくなるまで)。結果として、あなたがLinuxよりも多くのメモリを要求した場合、OSXは実際にスペースを使い始めるまで、OSXはokと言うでしょうが、失敗するでしょう。リソースが不足する可能性があります。最大サイズを指定すると、jvmにその制限が適用されます。 – Petesh

+0

@Peteshそれは答えとしてうまくいくようです。 –

+0

OS Xはディスク上にスワップファイルを割り当てるだけでなく、メモリを圧縮します。これにより、圧縮された状態で実際にどれくらいのメモリが占​​有されているかを判断することができなくなります。 – Palle

答えて

1

オペレーティングシステムの仕組みの違いです。 Linuxは「固定」スワップの概念を持っています。これは、物理RAM +システムに追加されたさまざまなスワップファイル/スワップパーティションに基づいています。これは、コミットできるメモリの最大限度とみなされます。

OSXでは、スワップは固定されているとはみなされません。オペレーティングシステム上でメモリが多くなるにつれてスワップファイルを追加し続けます(追加されるファイルは/var/vmにあります)。

結果として、OSXに利用可能なメモリよりもかなり多くのメモリを要求することができ、Linuxでは「いいえ」になりますが、効果的に「ok」で応答します。

上限制限はまだjavaによって強制されます。ヒープが指定されたサイズを超えると、java.lang.OutOfMemoryError: Java heap space例外を返します。したがって、-Xmx1Gを指定している場合は、JREによって強制されます。

あなたは簡単なテストプログラムとの違いを見ることができます:

import java.util.Vector; 

public class memtest { 

    public static void main(String args[]) throws Exception { 
     Vector<byte[]> v = new Vector<byte[]>(); 
     while (true) { 
      v.add(new byte[128 * 1024]); 
      System.out.println(v.size()); 
     } 

    } 
}; 

このプログラムは-Xmx100Mで実行された場合、それは-Xmx1Gで実行したとき、それはJava heap spaceメッセージで死ぬ、〜730回の反復の後Java heap spaceメッセージで死にます〜7300回の反復後に、その制限がJava仮想マシンによって強制されていることを示します。

+0

あなたはovercommitを許可するようにlinuxを設定することができます。また、osxと同様の動作をすることができます。linuxの 'sudo sysctl -w vm.overcommit_memory = 1'は' -Xmx200G'で実行できます。しかし、あなたがしたいことではありません。 – Petesh

+0

メモリを制限する方法を知っていますか?私は解決策を見つけることができませんでした。私はXmx128Mを入力しましたが、実際には230MB以上のメモリを使用していました。 128MB以上を使用するよりもクラッシュすることを推奨します。私のプロジェクトは、複数のユーザーがいるゲームサーバーのコントロールパネルです。すべてのユーザーがいくつかのクォータを取得します。 2G – user2850375

+0

@ user2850375 Xmxは、実際にVMを実行しているプロセスではなく、Javaヒープのサイズを制限します。特に、ヒープの外側に割り当てられたバイナリとメモリはXmxによって制限されません。 – Durandal

関連する問題