web-dev-qa-db-ja.com

Java(runtime.exec)からwgetを呼び出すと、ダウンロードがハングし、特定のファイルサイズに制限されます(curlと同じではありません)

問題の詳細

Javaからwgetを呼び出してファイルをダウンロードしようとしていますが、ファイルサイズが制限されるという奇妙な問題が発生し続けています。

たとえば、「wget https://speed.hetzner.de/1GB.bin "」を発行すると、ファイルサイズが1,048,576,000(正確に1 GB)の1GB.binが正しく表示されます。しかし、Javaから同じコマンドを呼び出すと、一貫して約40MBのファイルになります。

デバッグ

JDKがインストールされていると仮定すると、この動作を再現する [〜#〜] mcve [〜#〜] があります。

echo 'class RunCommand {
    public static void main(String[] args) throws Exception {
        String s = "";
        for (int i=0; i < args.length; i++)
            s += (i > 0 ? " " : "") + args[i];
        System.out.println(Runtime.getRuntime().exec(s).waitFor());
    }
}' > RunCommand.Java

javac RunCommand.Java

Java RunCommand wget https://speed.hetzner.de/1GB.bin

私はこれをクリーンなAWSCentOS7.6マシンで次のすべてを使用して試しました。

  • OpenJDK 7
  • OpenJDK 8
  • Oracle JDK 8

私はいつも同じ結果になります:Javaがハングし、ファイルサイズは約40MBです。

また、-Xms1024m -Xmx1024mを使用してヒープサイズを増やしてみましたが、ヒープサイズは問題ではないと結論付けました。

代わりにcurlを使用してまったく同じことを再度実行します。

Java RunCommand curl https://speed.hetzner.de/1GB.bin -o 1GB.bin

これは驚くほど機能し、1GBのファイルになりました。

質問

したがって、ここには多くの質問があります。

  1. Java 40 MB後にハングするのはなぜですか?
  2. なぜ常に正確に40MBなのですか? (-XX:+PrintFlagsFinalで40をgrepしても、手がかりはありません)
  3. Wgetコマンドとcurlコマンドの間には、一方が失敗し、もう一方が成功する可能性のある違いは何ですか?
1
Jbezos

コマンドに--quietを追加してみてください。入力ストリームを介して読み取っていないため、おそらく標準出力はいっぱいです。

これはwgetのマニュアルから抜粋したものです。

    -q
    --quiet
    Turn off Wget’s output.

以下のコードスニペットを確認してください。

import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;

/**
 * Created on 2/13/2019.
 *
 * @author Julien Saab
 */
public class TestCommand {
    public static void main(String[] args) throws Exception {

        final List<String> commands = new ArrayList<>(Arrays.asList(args));
        commands.add("--quiet");
        final Process process = new ProcessBuilder().command(commands).start();
        final int i = process.waitFor();

        System.out.printf("Process exited with code %1$s\n", i);
    }
}

あなたが使用しているのと同じファイルを試しましたが、41 MBを超えています(もちろん、完全にはダウンロードしていません)。

Java TestCommand wget https://speed.hetzner.de/1GB.bin
0
Julien Saab