現在、オンラインプログラミングコンテストの問題を解決しようとしています。このコンテストでは、プログラムの制限は64メガバイトです。なぜこのコードはあまりにも多くのメモリを必要としますか
私はこのように動作しますクラスdeclararationのフィールドの部分を持ってJavaでプログラムを書いた:
private int[] sizes = new int[1024]; // 4096 bytes
private boolean[][] compat = new boolean[1024][1024]; // 128 kb
private boolean[][] compat2 = new boolean[1024][1024]; // 128 kb
private long[][][] dp = new long[29000][51][2]; // About 3*8 = 24 megabytes
private int [][] masks = new int[29000][2]; // About 240 kb
private int avail = 0;
private int avail2 = 0;
private int[] positions = new int[500000]; // About 2 megabytes
private int[][] ranges = new int[29000][2]; // About 240 kb
private int[][] maskToPos = new int[1024][1024]; // About 4 megabytes
private int[][][] init = new int[29000][51][2]; // About 3*4 = 12 megabytes
さて、このクラスは、追加せずに、その内部に本体のみの手順と、いくつかのサイクルを持っています配列が宣言されています(サイクルを反復する変数)。しかし、私はローカルマシン上でこのコードを-Xmx64mキーで実行しようとしましたが、OutOfMemoryErrorがあります。それはキー-Xmx128mで実行するだけでした。
また、私はオンラインサーバーを立ち上げようとしましたが、同じエラーが発生し、私のプログラムが約148460 kbで使用したという追加情報も与えました。
なぜそんなに?私が上の部分から計算できる限り、それは約40メガバイトを使うべきです。コメントにこの計算に何か問題はありますか?
JVMにもメモリが必要であることを忘れないでください。 – Mysticial
これらの変数をすべて格納するために、なぜそれほどのメモリが必要なのでしょうか? –
私はここで手足に出て、これはどんなオンライン審査サイトでも大したことではないと思われます(主に私は多くのサイトで約300〜500の問題を解決したため、このようなものを書く必要はありませんでした) Javaには、考慮していないメタデータを格納するオーバーヘッドがあります。あなたのソリューションはおそらくそれほど多くのメモリを必要としないように最善の策だと考えてみてください。 –