Java 服务器错误,状态代码:400,错误代码:100005,消息:您已超过组织的内存限制
我正在尝试使用CloudFoundry将一个简单的Spring+Spring启动应用程序部署到IBMCloud。我的Docker文件如下所示: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
# 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}]'