У меня есть Java-программа, которая вызывает скрипт Python script.py
следующим образом
Process p1 = Runtime.getRuntime().exec("python3 /home/user/script.py " + id + " " + text);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p1.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p1.getErrorStream()));
String s;
StringBuilder t = new StringBuilder();
boolean isT = false;
while ((s = stdInput.readLine()) != null) {
isT = true;
t.append(s);
}
if (isT) {
stdInput.close();
stdError.close();
p1.destroy();
return t.toString();
}
logger.info(text);
StringBuilder error_text = new StringBuilder();
while ((s = stdError.readLine()) != null) {
error_text.append(s);
}
logger.info(error_text.toString());
stdInput.close();
stdError.close();
p1.destroy();
return text;
Этот сегмент кода вызывается в цикле всякий раз, когда выполняется какое-либо условие. Я получаю вывод из Python и собираю его, используя p1.getInputStream()
.
Сценарий Python выглядит следующим образом
import sys
text = ''
id_ = sys.argv[1]
for w in sys.argv[2:]:
text += w + ' '
text = text.replace('\n', ' ')
list_ = [text]
ret_val = my_function(list_)
with open('/home/user/output.txt', 'a') as out:
for r in ret_val:
print(r)
out.write(id_ + '\t\t' + r + '\n')
Вначале скрипт работает нормально, но со временем я получаю следующую ошибку
Exception in thread "..." java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.StringBuffer.toString(StringBuffer.java:669)
at java.io.BufferedReader.readLine(BufferedReader.java:359)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.LinkedHashMap.newNode(LinkedHashMap.java:256)
at java.util.HashMap.putVal(HashMap.java:631)
at java.util.HashMap.put(HashMap.java:612)
...
Даже после этого скрипт python вызывается несколько раз, и все работает нормально, но через некоторое время я продолжаю получать сообщение об ошибке следующим образом
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "..." java.lang.OutOfMemoryError: GC overhead limit exceeded
...
и мой скрипт на python перестает отвечать.
Я попытался остановить входные потоки с помощью stdInput.close()
и stdError.close()
, и я убиваю процесс с помощью p1.destroy()
, но я думаю, что это не разрушает подпроцессы или есть что-то еще, что я отсутствует, какие еще способы я могу достичь этого.
Спасибо.