gpt4 book ai didi

java - Spring Boot 在 64 位 JVM 上使用显着更多的内存

转载 作者:行者123 更新时间:2023-12-02 02:52:31 26 4
gpt4 key购买 nike

在 64 位 JVM(相对于 32 位)上运行相同的 Spring Boot 应用程序时,内存使用量会显着增加。

对于下面的示例 Eureka 应用程序,32 位 JVM 使用大约 100 MB RAM,而 64 位 JVM 使用大约 700 MB RAM。在同一台计算机上运行多个微服务开始成为一个问题。

有谁知道这是什么原因造成的吗?最重要的是,我们如何消除过多的内存使用?

下面的示例是我们的 Eurokea 服务器的精简版本,但它发生在我们所有的 Spring Boot 微服务中。

java 源代码:

@SpringBootApplication
@EnableEurekaServer
public class Eureka_SpringMVC {

public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(Eureka_SpringMVC.class).headless(false).run(args);
}

}

以及 Maven pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>ca.twosd.tcms</groupId>
<artifactId>TCMS_Web_Eureka</artifactId>
<version>1.0.0</version>

<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Camden.SR6</version> <!-- Name of release train -->
</parent>

<dependencies>
<dependency>
<!-- Setup Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<!-- Setup Spring MVC & REST, use Embedded Tomcat -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<!-- Spring Cloud starter -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>

<dependency>
<!-- Eureka for service registration -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

</dependencies>

<properties>
<start-class>ca.eurekatest.Eureka_SpringMVC</start-class>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

谢谢!

最佳答案

jvm 使用多少堆大小不仅取决于 jvm 版本,还取决于运行 jvm 的机器。唉,我没有找到这方面的规范。

我曾经遇到过在 Google 容器引擎上的 kubernetes 中的 docker 容器中运行 java 进程的问题,当在具有 54GB RAM 的 Google 计算引擎上运行时,jvm 会占用高达 16GB 的内存。当该主机上运行大量容器时,这绝对太多了。

不同本地计算机上的相同程序使用的内存要少得多。要了解 Java 程序默认在计算机上使用多少内存,请运行以下命令:

java -XX:+PrintFlagsFinal -version | grep -i heapsize

在我的 16GB 内存机器上打印:

    uintx ErgoHeapSizeLimit                         = 0                                   {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 268435456 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 4294967296 {product}
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

因此 JVM 最多占用可用内存的四分之一。在 32 位和 64 位版本上尝试一下,您可能会看到差异。

为了防止过度占用内存,请始终至少使用 -Xmx 参数启动 jvm,例如:

java -Xmx512m -XX:+PrintFlagsFinal -version | grep -i heapsize

现在显示:

    uintx ErgoHeapSizeLimit                         = 0                                   {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 268435456 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 536870912 {product}
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

您会看到 MaxHeapSize 值的差异。有关 java 选项 can be found here 的更多信息

关于java - Spring Boot 在 64 位 JVM 上使用显着更多的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43593866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com