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

Java 服务器错误,状态代码:400,错误代码:100005,消息:您已超过组织的内存限制,java,spring,spring-boot,docker,ibm-cloud,Java,Spring,Spring Boot,Docker,Ibm Cloud,我正在尝试使用CloudFoundry将一个简单的Spring+Spring启动应用程序部署到IBMCloud。我的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

我正在尝试使用CloudFoundry将一个简单的Spring+Spring启动应用程序部署到IBMCloud。我的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可用空间。但是,每次部署应用程序时,都会出现以下错误:

另外,当我运行ps命令检查正在运行的进程时,没有任何东西会消耗我所有的内存

我在本地运行了相同的应用程序,它最多只需要25MB,所以我的实例的256MB就足够了。有什么办法解决这个问题吗

注意:很遗憾,目前不允许我增加实例的容量

[更新]所以我决定从头开始,在IBM云中创建一个新的Java Spring应用程序。IBM会自动将其设置为开始,并将其克隆到您的回购协议中。应用程序部署正常,我可以访问它

现在,我删除了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

这怎么可能

对于Lite帐户,为一个帐户部署的所有应用程序的内存限制为256 MB:

您需要停止任何未使用的Cloud Foundry应用程序,或者升级您的帐户

在Cloud Foundry中,应用程序代码中的manifest.yml将指定内存

注意:如果您使用的是工具链,那么部署将创建一个新的应用程序,并在管道中的每次重新部署时切换路由,因此您将暂时运行两个应用程序以避免停机。这是另一种可能会遇到内存问题的情况,即应用程序指定256MB内存,但在两个应用程序都运行时,暂时会有512MB的使用量。若要解决此问题,请在运行管道之前手动停止正在运行的CF应用程序,否则将在停止时导致停机,或者升级您的帐户


对于Lite帐户,为一个帐户部署的所有应用程序的内存限制为256 MB:

您需要停止任何未使用的Cloud Foundry应用程序,或者升级您的帐户

在Cloud Foundry中,应用程序代码中的manifest.yml将指定内存

注意:如果您使用的是工具链,那么部署将创建一个新的应用程序,并在管道中的每次重新部署时切换路由,因此您将暂时运行两个应用程序以避免停机。这是另一种可能会遇到内存问题的情况,即应用程序指定256MB内存,但在两个应用程序都运行时,暂时会有512MB的使用量。若要解决此问题,请在运行管道之前手动停止正在运行的CF应用程序,否则将在停止时导致停机,或者升级您的帐户


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

我将应用程序实例的内存减少到64MB。 在manifest.yml中,我将应用程序的内存设置为192M。我的清单如下: 我将manifest.yml中的更改推送到repo,开始新的部署。这一次,应用程序成功部署并顺利运行。
注意:部署后,会覆盖实例的内存并分配192MB。为了在代码中执行任何进一步的更改,我需要在推送更改并部署应用程序之前将内存设置回64MB。

我找到了一个解决方案;这是相当出乎意料和违反直觉的。以下是我所做的:

我将应用程序实例的内存减少到64MB。 在manifest.yml中,我将应用程序的内存设置为192M。我的清单如下: 我将manifest.yml中的更改推送到repo,开始新的部署。这一次,应用程序成功部署并顺利运行。
注意:部署后,会覆盖实例的内存并分配192MB。为了在代码中执行任何进一步的更改,我需要在推送更改并部署应用程序之前将内存设置回64MB。

ps中的哪一行是您的应用程序?我以为MaxRAM需要字节?还要注意,如果JVM不支持它,它可能会被忽略;您确定它对您使用的Java和版本有效吗?Spring Boot应用程序在10M内运行的可能性为零。我怀疑MaxRAM没有像你想象的那样做。你的应用程序在ps中的哪一行?我以为MaxRAM需要字节?还要注意,如果JVM不支持它,它可能会被忽略;您确定它对您使用的Java和版本有效吗?Spring Boot应用程序在10M内运行的可能性为零。我怀疑MaxRAM没有像你想象的那样做。看来我的朋友更新了我们的案子,你知道吗?因为我们有空的应用程序,没有部署任何东西,我们仍然得到相同的错误。似乎我的朋友更新了我们的案例,你有吗 你知道吗?因为我们有空的应用程序,没有部署任何东西,我们仍然得到相同的错误。
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}]'