Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347

Всегда java.lang.OutOfMemoryError: Java heap space

01.02.2021, 17:52. Показов 3067. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, люди.

Очень нужна ваша помощь, как так я уже не знаю, что делать. Нет алгоритма действия.

Есть код, который отправляет файлы через соап-сервис. Внутри программы файл энкодится в Base64, оборачивается SOAP-оберткой и едет через soapConnection.call().

Но, как мне кажется, это и не важно, так как проблема не в невозможности что-то отправить. На маленьких файлах программа работает отлично.
Но стоит придти файлу с размером 180мб, как программа падает.


И тут я не понимаю. В системе еще 3Гб свободной ОЗУ, всего 8гб.
Настройки JVM
Code
1
2
3
4
5
6
7
8
9
10
11
-Xms256m
-Xmx4096m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
То есть ему еще должно хватать.

Написал тестовый код, который тоже энкодит и складывает в неочищаемую память:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
try{
            String path;
            path = "path_1";
            path =       "path_2";
            final int N = 100;
            List<String> inf = new ArrayList<>();
            Base64.Encoder en = Base64.getEncoder();
            for (int i = 0; i < N; i++) {
                System.out.println(i);
                String zip_str = en.encodeToString(Files.readAllBytes(Paths.get(path)));
                inf.add(zip_str);
                System.out.println(i);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
Чтобы посмотреть, как и когда заканчивается память...
На файле 182491 Кб программа падает уже на второй итерации, а на файле 88288 Кб (который успешно отправляется изначальной программой) - только на четвертой. Хотя разница размеров не в 4 раза...
_____________________________________
В общем, я не знаю, как надо настроить JVM, чтобы код не падал даже на большом файле. Хотя какой же он большой - даже 200мб нет.
Очень прошу помочь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.02.2021, 17:52
Ответы с готовыми решениями:

java.lang.OutOfMemoryError
java.lang.OutOfMemoryError - иногда выдается (очень редко) непонятно почему. Можно что-то предпринять?

ошибка java.lang.OutOfMemoryError...
при генерации приложением pdf документа большого размера, происходит ошибка java.lang.OutOfMemoryError. подскажите пожалуйста как...

java.lang.OutOfMemoryError: unable to create new native thread
При работе приложения (WebLogic8 SP1, Solaris8) после нескольких часов работы под большой нагрузкой, приложение падает с приведенным...

3
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
01.02.2021, 18:26
стэктрэйс где?
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
01.02.2021, 20:36  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
стэктрэйс где?
А зачем он нужен?

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
фев 01, 2021 6:29:41 PM com.sun.xml.internal.messaging.saaj.soap.MessageImpl saveChanges
SEVERE: SAAJ0540: Error during saving a multipart message
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Error during saving a multipart message
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1204)
    at informatica.soap.SendSOAP.createSOAPRequest(SendSOAP.java:140)
    at informatica.soap.SendSOAP.callSoapWebService(SendSOAP.java:102)
    at run.soap.SendSOAPRun.onInputRow(SendSOAPRun.java:61)
    at informatica.run.BasicRun.allRun(BasicRun.java:34)
    at run.soap.SendSOAPRun.main(SendSOAPRun.java:108)
Caused by: java.lang.OutOfMemoryError: Java heap space
    at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(ToUnknownStream.java:345)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:244)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:136)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:98)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:693)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:351)
    at com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer.transform(EfficientStreamingTransformer.java:399)
    at com.sun.xml.internal.messaging.saaj.soap.impl.EnvelopeImpl.output(EnvelopeImpl.java:289)
    at com.sun.xml.internal.messaging.saaj.soap.impl.EnvelopeImpl.output(EnvelopeImpl.java:302)
    at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getContentAsStream(SOAPPartImpl.java:311)
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.getHeaderBytes(MessageImpl.java:1015)
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1166)
    ... 5 more
 
CAUSE:
 
java.lang.OutOfMemoryError: Java heap space
    at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(ToUnknownStream.java:345)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:244)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:136)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:98)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:693)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:351)
    at com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer.transform(EfficientStreamingTransformer.java:399)
    at com.sun.xml.internal.messaging.saaj.soap.impl.EnvelopeImpl.output(EnvelopeImpl.java:289)
    at com.sun.xml.internal.messaging.saaj.soap.impl.EnvelopeImpl.output(EnvelopeImpl.java:302)
    at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getContentAsStream(SOAPPartImpl.java:311)
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.getHeaderBytes(MessageImpl.java:1015)
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1166)
    at informatica.soap.SendSOAP.createSOAPRequest(SendSOAP.java:140)
    at informatica.soap.SendSOAP.callSoapWebService(SendSOAP.java:102)
    at run.soap.SendSOAPRun.onInputRow(SendSOAPRun.java:61)
    at informatica.run.BasicRun.allRun(BasicRun.java:34)
    at run.soap.SendSOAPRun.main(SendSOAPRun.java:108)
Добавлено через 2 часа 5 минут
Тогда уж и код надо добавить:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
public class SendSOAP {
    public static final String MY_NAMESPACE = "tem";
    public static final String MY_NAMESPACE_URI = "http://tempuri.org/";
 
    public static String callSoapWebService(
            String soapEndpointUrl
            , String soapAction
            , String KeyDir
            , String KeyPass
            , String data
            , int connectTimeout
            , int readTimeout
    ) throws Exception {
        // Create SOAP Connection
        SOAPConnection soapConnection = SOAPConnectionFactory.newInstance().createConnection();
        try (AutoCloseable ignored = soapConnection::close) {
            HttpsURLConnection connection = (HttpsURLConnection) new URL(soapEndpointUrl).openConnection();
            connection.setSSLSocketFactory(
                    SSLContextWithCert.builder()
                            .setPathToKeyStore(KeyDir)
                            .setPassword(KeyPass)
                            .getSSLContext()
                            .getSocketFactory()
            );
            connection.setHostnameVerifier((hostname, session) -> true);
            connection.setConnectTimeout(connectTimeout * 1000); // in sec
            connection.setReadTimeout(readTimeout * 1000); // in sec
 
            URL endPoint = new URL(null, soapEndpointUrl, new URLStreamHandler() {
                @Override
                protected URLConnection openConnection(URL url) {
                    return (connection);
                }
            });
            // Send SOAP Message to SOAP Server
            SOAPMessage soapResponse = soapConnection.call(
                    createSOAPRequest(soapAction, data)
                    , endPoint
            );
            ByteArrayOutputStream soapOut = new ByteArrayOutputStream();
            soapResponse.writeTo(soapOut);
            return soapOut.toString(String.valueOf(StandardCharsets.UTF_8));
        }
    }
    protected static SOAPMessage createSOAPRequest(String soapAction, String data) throws SOAPException {
        SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
        MimeHeaders headers = soapMessage.getMimeHeaders();
        headers.addHeader("X-Add-Data", "IncomeFromInformatica");
        headers.addHeader("SOAPAction", soapAction);
        // SOAP Envelope
        SOAPEnvelope envelope = soapMessage.getSOAPPart().getEnvelope();
        envelope.addNamespaceDeclaration(MY_NAMESPACE, MY_NAMESPACE_URI);
        // SOAP Body
        envelope.getBody()
                .addChildElement("submitEgb", MY_NAMESPACE)
                .addChildElement("Body", MY_NAMESPACE)
                .addTextNode(data);
        soapMessage.saveChanges();
        return soapMessage;
    }
 
    public static String getTagValue(String soapMsg, String strTagName) throws XMLParseException {
        try {
            Document document = DocumentBuilderFactory
                    .newInstance()
                    .newDocumentBuilder()
                    .parse(
                            new InputSource(new StringReader(soapMsg))
                    );
            XPathExpression xPathExpression = XPathFactory
                    .newInstance()
                    .newXPath()
                    .compile(strTagName);
            return xPathExpression.evaluate(document);
        } catch (SAXException | IOException | ParserConfigurationException | XPathExpressionException e) {
            throw new XMLParseException(e);
        }
    }
}
0
 Аватар для Thousbe
53 / 27 / 9
Регистрация: 04.05.2013
Сообщений: 83
06.02.2021, 21:55
С таким размером данных размер кучи должен быть ну очень большим.

181 МБ изначальных данных (если байты превращаются в строку, то умножаем на 2), Base64.Encoder.encodeToString порождает еще два массива аналогичного размера, ToUnknownStream.characters(String) еще выделяет один массив двойного размера.
Итого 181 * 5 (* 6) = 905 МБ (1086 МБ для строки). Это только примеры беглово анализа стектрейса, вероятно, где-нибудь происходит еще выделение памяти.

Непонятно, какую нагрузку держит код, и если такого размера данные идут потоком, то выделенные 4 ГБ уйдут очень быстро.

Если данные на отправку не копятся в очереди в памяти, то можно вызывать сборщик мусора после каждой отправки.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2021, 21:55
Помогаю со студенческими работами здесь

render file.fo (>5Mb) to pdf java.lang.OutOfMemoryError
I have a problem with FOP &lt;p&gt; When I trying to render file.fo (&gt;5Mb) to pdf I have an error java.lang.OutOfMemoryError &lt;p&gt; But at...

Java.lang.ClassCastException: MyBaza.Diag cannot be cast to java.lang.Comparable
Подскажите как исправить... Exception in thread &quot;AWT-EventQueue-0&quot; java.lang.ClassCastException: MyBaza.Diag cannot be cast to...

'fr.java': Ошибка #: 300 : method getObject(int) not found in class java.lang.String строка 33, символ 18
'fr.java': Ошибка #: 300 : method getObject(int) not found in class java.lang.String строка 33, символ 18

Exception in thread "main" java.lang.NoClassDefFoundError:c:HelloWorldApp/java
Exception in thread 'main' java.lang.NoClassDefFoundError:c:HelloWorldApp/java вот это выходит каждый раз когда после того как я пытаюсь...

Ошибка Java Head Space
Доброе время суток. Подскажите пожалуйста, приложение выдает ошибку Java Head Space, в детализации написано &quot;outofmemoryerror: java...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru