java - 服务器错误,状态代码 : 400, 错误代码 : 100005, 消息:您已超出组织的内存限制

标签 java spring spring-boot docker ibm-cloud

我正在尝试使用 Cloud Foundry 将一个简单的 Spring + Spring Boot 应用程序部署到 IBM Cloud。我的 Docker 文件如下所示:

# IBM Java SDK UBI is not available on public docker yet. Use regular
# base as builder until this is ready. For reference:
# https://github.com/ibmruntimes/ci.docker/tree/master/ibmjava/8/sdk/ubi-min

FROM ibmjava:8-sdk AS builder
LABEL maintainer="IBM Java Engineering at IBM Cloud"

WORKDIR /app
RUN apt-get update && apt-get install -y maven

COPY pom.xml .
RUN mvn -N io.takari:maven:wrapper -Dmaven=3.5.0

COPY . /app
RUN ./mvnw install

ARG bx_dev_user=root
ARG bx_dev_userid=1000
RUN BX_DEV_USER=$bx_dev_user
RUN BX_DEV_USERID=$bx_dev_userid
RUN if [ $bx_dev_user != "root" ]; then useradd -ms /bin/bash -u $bx_dev_userid $bx_dev_user; fi

# Multi-stage build. New build stage that uses the UBI as the base image.

# In the short term, we are using the OpenJDK for UBI. Long term, we will use
# the IBM Java Small Footprint JVM (SFJ) for UBI, but that is not in public
# Docker at the moment.
# (https://github.com/ibmruntimes/ci.docker/tree/master/ibmjava/8/sfj/ubi-min)

FROM adoptopenjdk/openjdk8:ubi-jre

# Copy over app from builder image into the runtime image.
RUN mkdir /opt/app
COPY --from=builder /app/target/javaspringapp-1.0-SNAPSHOT.jar /opt/app/app.jar

ENTRYPOINT [ "sh", "-c", "java -jar -XX:MaxRAM=10m /opt/app/app.jar" ]

如您所见,我已将应用程序限制为最多使用 10MB,而我的实例有 256MB 可用空间。但是,每次部署应用程序时,我都会收到以下错误: Log 1

此外,当我运行 ps 命令来检查正在运行的进程时,没有什么会消耗我的所有内存。

Log 2

我在本地运行了相同的应用程序,它最多只需要 25MB,因此我的实例的 256MB 应该足够了。关于如何解决这个问题有什么想法吗?

注意:不幸的是,我目前不允许增加实例的容量。


[更新] 因此,我决定从头开始,在 IBM Cloud 中创建一个新的 Java Spring 应用程序。 IBM 自动将其设置为以 this template 开头,它被克隆到您的存储库中。应用程序已正常部署,我可以访问它。

现在,我删除了 HTML 中的一行代码并尝试再次部署。令我惊讶的是,我得到了:

FAILED
Error restarting application: Server error, status code: 400, error code: 100005, message: You have exceeded your organization's memory limit: app requested more memory than available

这怎么可能?!

最佳答案

我找到了解决办法;这是相当出乎意料且违反直觉的。这是我所做的:

  1. 我将应用实例的内存减少到 64MB。

enter image description here

  • 在manifest.yml中,我将应用程序的内存设置为192M。我的 list 如下所示:

  • applications:
    - instances: 1
      timeout: 180
      name: appname
      buildpack: java_buildpack
      path: ./target/appname-1.0-SNAPSHOT.jar
      disk_quota: 1G
      memory: 192M
      domain: eu-gb.mybluemix.net
      host: appHost
      env:
        JAVA_OPTS: '-XX:ReservedCodeCacheSize=32M -XX:MaxDirectMemorySize=32M'
        JBP_CONFIG_OPEN_JDK_JRE: '[memory_calculator: {stack_threads: 2}]'
    
  • 我将 manifest.yml 中的更改推送到存储库,开始新的部署。这次应用部署成功,运行顺利。
  • 注意:部署后,实例的内存将被覆盖并分配 192MB。为了在代码中执行任何进一步的更改,我需要在推送更改和部署应用程序之前将内存设置回 64MB。

    关于java - 服务器错误,状态代码 : 400, 错误代码 : 100005, 消息:您已超出组织的内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63004441/

    相关文章:

    spring - 来自 Spring Hateoas 的文档 HAL "_links"( Swagger )?

    Spring Profiles 应用程序属性顺序

    java - 如何知道 Java 应用程序是否使用 MVC 设计模式?

    java - 无法从 Java 程序执行 shell 脚本

    java - 如何修复这个sql异常

    java - mongodb + java + iso 日期搜索

    java - 如何使用 Spring Boot 检测并禁止 IP 地址发出过多请求?

    java - 在gradle中导入Apache速度会降级HttpServletResponse

    java - Hibernate @OneToMany 映射给出异常,

    java - IO/网络绑定(bind) Fork/Join-Tasks