Выброс OutOfMemoryError с помощью Jackson ObjectMapper

Я пытаюсь получить строку формата JSON из ObjectMapper внутри потока AsyncTask, и я продолжаю получать OutOfMemoryError И в файле манифеста уже добавили строку

Файл манифеста:

    android:largeHeap = "true"
    android:hardwareAccelerated = "false"

Метод AsyncTask, выполняемый в doInBackground:

    String url = "/plano/fiscalizacao/fiscalizar";

    Realm realm = Realm.getDefaultInstance();


    Fiscalizacao fiscalizacao = RealmOperations.getFiscalizacaoById(realm, idFiscalizacao);

    if (fiscalizacao == null)
        return;

    ObjectMapper mapper = new ObjectMapperProvider().createDefaultObjectMapper();

    String json = mapper.writeValueAsString(fiscalizacao);

    StringEntity entity = new StringEntity(json, "UTF-8");
    //HttpEntity entity = new ByteArrayEntity(json.getBytes("UTF-8"));

    HttpResponse response = WebServiceSupport.post(context, url, entity);

    if (WebServiceSupport.validaStatus(response)) {
        String str = EntityUtils.toString(response.getEntity(), "UTF-8");
    }

Класс Fiscalizacao:

private static final long serialVersionUID = 1L;
@Nullable
private Date dataFiscalizacao;
@Nullable
private PlanoFiscalizacaoProcesso plano;
@Nullable
private String relatorio;
@Nullable
private Reparticao reparticao;
@PrimaryKey
private Long selfId;
@Nullable
private SyncStatus status_sync;
private TipoGrauAproveitamento tipoGrauAproveitamento;
private TipoMedida tipoMedida;
@Nullable
private Date versionDate;

Stacktrace к проблеме, которая у меня есть:

08-22 14:04:12.623 22737-32404/exi.co.mz.sigit.fiscalizacao E/UncaughtException:
java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:300)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.OutOfMemoryError: Failed to allocate a 524300 byte allocation with 277842 free bytes and 271KB until OOM
    at com.fasterxml.jackson.core.util.TextBuffer._charArray(TextBuffer.java:716)
    at com.fasterxml.jackson.core.util.TextBuffer.expand(TextBuffer.java:675)
    at com.fasterxml.jackson.core.util.TextBuffer.append(TextBuffer.java:471)
    at com.fasterxml.jackson.core.io.SegmentedStringWriter.write(SegmentedStringWriter.java:67)
    at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.writeRaw(WriterBasedJsonGenerator.java:476)
    at com.fasterxml.jackson.core.util.DefaultPrettyPrinter$Lf2SpacesIndenter.writeIndentation(DefaultPrettyPrinter.java:382)
    at com.fasterxml.jackson.core.util.DefaultPrettyPrinter.writeEndObject(DefaultPrettyPrinter.java:247)
    at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.writeEndObject(WriterBasedJsonGenerator.java:179)
    at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.close(WriterBasedJsonGenerator.java:882)
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2727)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2210)
    at exi.co.mz.fiscalizacao.rest.ParcelaClient.setFiscalizacao(ParcelaClient.java:184)
    at exi.co.mz.fiscalizacao.rest.ParcelaClient.doInBackground(ParcelaClient.java:239)
    at exi.co.mz.fiscalizacao.rest.ParcelaClient.doInBackground(ParcelaClient.java:33)
    at android.os.AsyncTask$2.call(AsyncTask.java:288)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818)

Продолжение трассировки стека:

08-22 14:04:12.923 22737-32404/exi.co.mz.sigit.fiscalizacao E/AndroidRuntime:
FATAL EXCEPTION: AsyncTask #3
Process: exi.co.mz.sigit.fiscalizacao, PID: 22737
java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:300)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:818)

Попытка соответствовать стандартам большого количества кода:

Caused by: java.lang.OutOfMemoryError: Failed to allocate a 524300 byte allocation with 277842 free bytes and 271KB until OOM
at com.fasterxml.jackson.core.util.TextBuffer._charArray(TextBuffer.java:716)
at com.fasterxml.jackson.core.util.TextBuffer.expand(TextBuffer.java:675)
at com.fasterxml.jackson.core.util.TextBuffer.append(TextBuffer.java:471)
at com.fasterxml.jackson.core.io.SegmentedStringWriter.write(SegmentedStringWriter.java:67)
at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.writeRaw(WriterBasedJsonGenerator.java:476)
at com.fasterxml.jackson.core.util.DefaultPrettyPrinter$Lf2SpacesIndenter.writeIndentation(DefaultPrettyPrinter.java:382)
at com.fasterxml.jackson.core.util.DefaultPrettyPrinter.writeEndObject(DefaultPrettyPrinter.java:247)
at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.writeEndObject(WriterBasedJsonGenerator.java:179)
at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.close(WriterBasedJsonGenerator.java:882)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2727)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2210)
at exi.co.mz.fiscalizacao.rest.ParcelaClient.setFiscalizacao(ParcelaClient.java:184)
at exi.co.mz.fiscalizacao.rest.ParcelaClient.doInBackground(ParcelaClient.java:239)
at exi.co.mz.fiscalizacao.rest.ParcelaClient.doInBackground(ParcelaClient.java:33)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:818) 

Вызвано: java.lang.OutOfMemoryError: не удалось выделить 524300 байтов с 277842 свободными байтами и 271 КБ до OOM в com.fasterxml.jackson.core.util.TextBuffer._charArray (TextBu‌ ffer.java:716) на com. fastxml.jackson.core.util.TextBuffer.expand (TextBuffer‌ .java: 675)

Wildman Group 22.08.2018 14:13

Отредактируйте свой вопрос и включите трассировку стека. Это поможет в диагностике вашей проблемы.

cincy_anddeveloper 22.08.2018 14:20

это как было отредактировано мой друг

Wildman Group 22.08.2018 14:36

Ваша проблема, похоже, заключается в том, что вы читаете слишком много информации в строке «mapper.writeValueAsString (fiscalizacao)». Я бы рекомендовал попытаться получать данные гораздо меньшими порциями.

cincy_anddeveloper 22.08.2018 14:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
455
1

Ответы 1

Получил решение

При работе с Realm необходимо извлечь объект из базы данных realm с помощью .copyFromRealm ()

    Realm realm = Realm.getDefaultInstance();

    Fiscalizacao fiscalizacao = realm.copyFromRealm(RealmOperations.getFiscalizacaoById(realm, idFiscalizacao));

Перед сериализацией JSON может быть хорошей идеей сделать объект отсоединенным, но не обязательно в каждом сценарии.

EpicPandaForce 23.08.2018 23:39

Другие вопросы по теме