Развертывание docker-compose JHipster 6.0.1: пространство кучи Java - PullRequest
4 голосов
/ 29 мая 2019

У меня 2 приложения. Приложение 1 использует JHipster 5.8.2, который я развертываю на капле Digital Ocean с 2 ГБ ОЗУ и, после загрузки своего изображения в реестр gitlab, запускаю его docker-compose -f app.yml up (который имеет _JAVA_OPTIONS=-Xmx512m -Xms256m), и все работает идеально примерно через 45 секунд. .

Приложение 2 было сгенерировано с помощью JHipster 6.0.1 (на самом деле это обновление моего приложения 1). Я использовал аналогичную каплю из Приложения 1 для своего Приложения 2: одноядерный с 2 ​​ГБ ОЗУ, но это не удалось из-за Java Heap Space. После этого я изменил свою каплю на 4 ГБ 2-ядерную каплю и изменил свою конфигурацию app.yml на следующую: _JAVA_OPTIONS=-Xmx3072m -Xms2048m, но она все равно не работает с той же проблемой и через 40 минут.

После этой ошибки я попытался запустить образ на моем компьютере с 32 ГБ, через 2,5 часа возникла та же проблема.

Вот как я упаковал свое приложение 6.0.1:

  • /mvnw verify -Pprod -DskipTests
  • ./mvnw jib:build -Dimage=registry.gitlab.com/amatos/project

В моей капельке:

  • docker-compose -f app.yml up -d

Это должно работать, но оно никогда не проходит линию Web application fully configured и через несколько минут (в зависимости от объема ОЗУ) происходит сбой.

Есть ли дополнительный шаг, который я пропускаю?

ВЫВОД:

После долгих испытаний я обнаружил, что, добавив пользовательский DTO, я получаю проблему с пространством кучи Java.

Сгенерированный DTO:

package com.facturapp.service.dto;
import javax.validation.constraints.*;
import java.io.Serializable;
import java.util.Objects;
import javax.persistence.Lob;

/**
 * A DTO for the {@link com.facturapp.domain.Address} entity.
 */
public class AddressDTO implements Serializable {

    private Long id;

    @NotNull
    private String name;

    private String contact;

    private String mobile;

    private String address;

    @Lob
    private String note;

    private Boolean delivery;

    private Boolean invoicing;

    private Boolean active;


    private Long districtId;

    private String districtName;

    private Long partnerId;

    private String partnerName;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContact() {
        return contact;
    }

    public void setContact(String contact) {
        this.contact = contact;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

    public Boolean isDelivery() {
        return delivery;
    }

    public void setDelivery(Boolean delivery) {
        this.delivery = delivery;
    }

    public Boolean isInvoicing() {
        return invoicing;
    }

    public void setInvoicing(Boolean invoicing) {
        this.invoicing = invoicing;
    }

    public Boolean isActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    public Long getDistrictId() {
        return districtId;
    }

    public void setDistrictId(Long districtId) {
        this.districtId = districtId;
    }

    public String getDistrictName() {
        return districtName;
    }

    public void setDistrictName(String districtName) {
        this.districtName = districtName;
    }

    public Long getPartnerId() {
        return partnerId;
    }

    public void setPartnerId(Long partnerId) {
        this.partnerId = partnerId;
    }

    public String getPartnerName() {
        return partnerName;
    }

    public void setPartnerName(String partnerName) {
        this.partnerName = partnerName;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        AddressDTO addressDTO = (AddressDTO) o;
        if (addressDTO.getId() == null || getId() == null) {
            return false;
        }
        return Objects.equals(getId(), addressDTO.getId());
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(getId());
    }

    @Override
    public String toString() {
        return "AddressDTO{" +
            "id=" + getId() +
            ", name='" + getName() + "'" +
            ", contact='" + getContact() + "'" +
            ", mobile='" + getMobile() + "'" +
            ", address='" + getAddress() + "'" +
            ", note='" + getNote() + "'" +
            ", delivery='" + isDelivery() + "'" +
            ", invoicing='" + isInvoicing() + "'" +
            ", active='" + isActive() + "'" +
            ", district=" + getDistrictId() +
            ", district='" + getDistrictName() + "'" +
            ", partner=" + getPartnerId() +
            ", partner='" + getPartnerName() + "'" +
            "}";
    }
}

Custom DTO

package com.facturapp.service.dto;

import com.facturapp.domain.District;

/**
 * A DTO for the {@link com.facturapp.domain.Address} entity.
 */
public class AddressFaDTO extends AddressDTO {

    private District district;

    public District getDistrict() {
        return district;
    }

    public void setDistrict(District district) {
        this.district = district;
    }
}

Пользовательский DTO - Address и расширяет сгенерированный DTO. Сгенерированный DTO имеет несколько полей, 2 из которых districtId (Long) и districtName (String), но мой пользовательский DTO также имеет district (District). Класс District имеет свойство Province, которое также имеет Region, которое также имеет Country. Поэтому, когда я получаю Address, я также получаю округ, провинцию, регион и страну.

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

Если я использую сгенерированный DTO, у меня нет проблем, но когда я использую свой собственный DTO, приложение не запускается и не запускается из-за пространства кучи Java.

Журналы ошибок

facturapp_1  | 2019-06-03 06:56:20.395  INFO 1 --- [  restartedMain] com.almasoft.facturapp.FacturApp         : Starting FacturApp on c40efbe18b21 with PID 1 (/app/classes started by root in /)
facturapp_1  | 2019-06-03 06:56:20.407  INFO 1 --- [  restartedMain] com.almasoft.facturapp.FacturApp         : The following profiles are active: prod,swagger
facturapp_1  | 2019-06-03 06:56:45.918  WARN 1 --- [  restartedMain] i.g.j.c.liquibase.AsyncSpringLiquibase   : Warning, Liquibase took more than 5 seconds to start up!
facturapp_1  | 2019-06-03 06:56:57.351  INFO 1 --- [  restartedMain] c.a.facturapp.config.WebConfigurer       : Web application configuration, using profiles: prod
facturapp_1  | 2019-06-03 06:56:57.353  INFO 1 --- [  restartedMain] c.a.facturapp.config.WebConfigurer       : Web application fully configured
facturapp_1  | WARNING: An illegal reflective access operation has occurred
facturapp_1  | WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils (file:/app/libs/spring-core-5.1.6.RELEASE.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
facturapp_1  | WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils
facturapp_1  | WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
facturapp_1  | WARNING: All illegal access operations will be denied in a future release
facturapp_1  | 2019-06-03 07:03:27.207  WARN 1 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.OutOfMemoryError: Java heap space
facturapp_1  | 2019-06-03 07:03:27.606 ERROR 1 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed
facturapp_1  |
facturapp_1  | org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.OutOfMemoryError: Java heap space
facturapp_1  |  at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:185)
facturapp_1  |  at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:53)
facturapp_1  |  at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:360)
facturapp_1  |  at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:158)
facturapp_1  |  at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:122)
facturapp_1  |  at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:893)
facturapp_1  |  at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:163)
facturapp_1  |  at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552)
facturapp_1  |  at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
facturapp_1  |  at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
facturapp_1  |  at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
facturapp_1  |  at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
facturapp_1  |  at com.facturapp.FacturApp.main(FacturApp.java:63)
facturapp_1  |  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
facturapp_1  |  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
facturapp_1  |  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
facturapp_1  |  at java.base/java.lang.reflect.Method.invoke(Unknown Source)
facturapp_1  |  at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
facturapp_1  | Caused by: com.google.common.util.concurrent.ExecutionError: java.lang.OutOfMemoryError: Java heap space
facturapp_1  |  at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2049)
facturapp_1  |  at com.google.common.cache.LocalCache.get(LocalCache.java:3953)
facturapp_1  |  at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3976)
facturapp_1  |  at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4960)
facturapp_1  |  at springfox.documentation.schema.CachingModelDependencyProvider.dependentModels(CachingModelDependencyProvider.java:58)
facturapp_1  |  at springfox.documentation.schema.DefaultModelProvider.dependencies(DefaultModelProvider.java:128)
facturapp_1  |  at springfox.documentation.schema.CachingModelProvider.dependencies(CachingModelProvider.java:68)
facturapp_1  |  at springfox.documentation.spring.web.scanners.ApiModelReader.populateDependencies(ApiModelReader.java:136)
facturapp_1  |  at springfox.documentation.spring.web.scanners.ApiModelReader.read(ApiModelReader.java:78)
facturapp_1  |  at springfox.documentation.spring.web.scanners.ApiListingScanner.scan(ApiListingScanner.java:133)
facturapp_1  |  at springfox.documentation.spring.web.scanners.ApiDocumentationScanner.scan(ApiDocumentationScanner.java:71)
facturapp_1  |  at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.scanDocumentation(DocumentationPluginsBootstrapper.java:101)
facturapp_1  |  at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:167)
facturapp_1  |  at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:182)
facturapp_1  |  ... 17 common frames omitted
facturapp_1  | Caused by: java.lang.OutOfMemoryError: Java heap space
facturapp_1  |  at java.base/java.util.Arrays.copyOf(Unknown Source)
facturapp_1  |  at java.base/java.util.ArrayList.grow(Unknown Source)
facturapp_1  |  at java.base/java.util.ArrayList.addAll(Unknown Source)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedPropertiesAndFields(DefaultModelDependencyProvider.java:181)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedDependencies(DefaultModelDependencyProvider.java:120)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.maybeFromRegularType(DefaultModelDependencyProvider.java:207)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedPropertiesAndFields(DefaultModelDependencyProvider.java:183)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedDependencies(DefaultModelDependencyProvider.java:120)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.maybeFromRegularType(DefaultModelDependencyProvider.java:207)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedPropertiesAndFields(DefaultModelDependencyProvider.java:183)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedDependencies(DefaultModelDependencyProvider.java:120)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.maybeFromCollectionElementType(DefaultModelDependencyProvider.java:220)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedPropertiesAndFields(DefaultModelDependencyProvider.java:181)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedDependencies(DefaultModelDependencyProvider.java:120)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.maybeFromCollectionElementType(DefaultModelDependencyProvider.java:220)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedPropertiesAndFields(DefaultModelDependencyProvider.java:181)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedDependencies(DefaultModelDependencyProvider.java:120)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.maybeFromCollectionElementType(DefaultModelDependencyProvider.java:220)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedPropertiesAndFields(DefaultModelDependencyProvider.java:181)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedDependencies(DefaultModelDependencyProvider.java:120)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.maybeFromRegularType(DefaultModelDependencyProvider.java:207)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedPropertiesAndFields(DefaultModelDependencyProvider.java:183)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.resolvedDependencies(DefaultModelDependencyProvider.java:120)
facturapp_1  |  at springfox.documentation.schema.DefaultModelDependencyProvider.dependentModels(DefaultModelDependencyProvider.java:79)
facturapp_1  |  at springfox.documentation.schema.CachingModelDependencyProvider$1.load(CachingModelDependencyProvider.java:50)
facturapp_1  |  at springfox.documentation.schema.CachingModelDependencyProvider$1.load(CachingModelDependencyProvider.java:48)
facturapp_1  |  at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3529)
facturapp_1  |  at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2278)
facturapp_1  |  at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2155)
facturapp_1  |  at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2045)
facturapp_1  |  at com.google.common.cache.LocalCache.get(LocalCache.java:3953)
facturapp_1  |  at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3976)

Мои вопросы:

  1. почему у меня возникает такая проблема из-за расширения простого DTO?
  2. как я могу решить эту проблему?

1 Ответ

0 голосов
/ 06 июня 2019

Моя ошибка заключалась в использовании класса домена в качестве поля вместо класса DTO для адреса.

По-прежнему остается вопрос, почему возникает проблема с памятью при запуске приложения, а не при вызове метода, использующего неисправный класс.

...