当前位置: 首页 > 知识库问答 >
问题:

如何减少spring boot内存使用量?

干浩然
2023-03-14

我正在使用spring boot开发客户端应用程序。在运行spring boot应用程序(使用完全可执行的jar)时,x64服务器的内存占用约为190M,x86服务器的内存占用约为110M。

我的jvm选项是(-xmx64m-xms64m-xx:maxpermsize=64m-server),为什么在x64服务器中,内存占用这么大?如何将内存使用量降低到150M以下?

多谢了。

共有3个答案

桂志诚
2023-03-14

您可以使用-xx:+useSerialGC作为JVM参数来指定串行垃圾回收器,这是减少内存堆的最佳选择。

杨慎之
2023-03-14

经过搜索,我发现它在Stackoveflow已经有了答案。spring boot内存消耗增加超过-xmx选项

1. Number of http threads (Undertow starts around 50 threads per default, but you can increase / decrease via property the amount of threads needed)
2. Access to native routines (.dll, .so) via JNI
3. Static variables
4. Use of cache (memcache, ehcache, etc)
If a VM is 32 bit or 64 bit, 64 bit uses more memory to run the same application, so if you don't need a heap bigger than 1.5GB, so keep your application runnnig over 32 bit to save memory.

因为spring boot对http服务(Tomcat或Undertow、Jetty)的每个默认启动大约50个线程,并且每个线程使用1 MB(64位jvm默认设置)。

因此,在64位jvm中,内存使用量是堆(64M)+Permgen(最大64M)+线程堆栈(1M x 50+)+本机句柄。

参考资料:

  • https://dzone.com/articles/how-to-reduce-jvm-memory-consumps-in-docker-u
  • http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-/
  • https://developers.redhat.com/blog/2017/04/04/openjdk-and-containers/
叶俊郎
2023-03-14

到这里来有点晚了,但我在Docker上的一个容器化的spring boot应用程序也遇到了同样的问题。最简单的spring boot应用程序只有7200万内存,只有一个控制器和嵌入式Tomcat。再加上spring数据REST、spring安全和一些JPA实体,您将会看到至少200M-300M。通过使用以下JVM选项,您可以将一个简单的spring boot应用程序降至大约7200万个。

使用-xx:+useserialgc时,这将执行内联垃圾回收,线程将分配堆内存,而不是专用的GC线程

使用-xss512k时,将每个线程的堆栈内存限制为512KB,而不是默认的1MB

使用-xx:maxram=72m时,这将限制JVM对堆和非堆托管内存的计算在该值的限制范围内。

除了上述JVM选项之外,您还可以在application.properties文件中使用以下属性:

server.tomcat.max-threads=1这将把HTTP请求处理程序线程的数量限制为1(默认值为200)

下面是docker Stats运行一个非常简单的spring boot应用程序的示例,该应用程序具有上述限制,并使用docker-m 72m参数。如果我将值降低到低于这个值,我就无法启动应用程序

83CCC9B2156D:Mem使用率:70.36MIB/72MIB Mem百分比:97.72%

在这里,您可以看到退出时所有本机和Java堆内存的明细。

Native Memory Tracking:

Total: reserved=1398681KB, committed=112996KB
-                 Java Heap (reserved=36864KB, committed=36260KB)
                            (mmap: reserved=36864KB, committed=36260KB) 

-                     Class (reserved=1086709KB, committed=43381KB)
                            (classes #7548)
                            (  instance classes #7049, array classes #499)
                            (malloc=1269KB #19354) 
                            (mmap: reserved=1085440KB, committed=42112KB) 
                            (  Metadata:   )
                            (    reserved=36864KB, committed=36864KB)
                            (    used=36161KB)
                            (    free=703KB)
                            (    waste=0KB =0.00%)
                            (  Class space:)
                            (    reserved=1048576KB, committed=5248KB)
                            (    used=4801KB)
                            (    free=447KB)
                            (    waste=0KB =0.00%)

-                    Thread (reserved=9319KB, committed=938KB)
                            (thread #14)
                            (stack: reserved=9253KB, committed=872KB)
                            (malloc=50KB #74) 
                            (arena=16KB #26)

-                      Code (reserved=248678KB, committed=15310KB)
                            (malloc=990KB #4592) 
                            (mmap: reserved=247688KB, committed=14320KB) 

-                        GC (reserved=400KB, committed=396KB)
                            (malloc=272KB #874) 
                            (mmap: reserved=128KB, committed=124KB) 

-                  Compiler (reserved=276KB, committed=276KB)
                            (malloc=17KB #409) 
                            (arena=260KB #6)

-                  Internal (reserved=660KB, committed=660KB)
                            (malloc=620KB #1880) 
                            (mmap: reserved=40KB, committed=40KB) 

-                    Symbol (reserved=11174KB, committed=11174KB)
                            (malloc=8417KB #88784) 
                            (arena=2757KB #1)

-    Native Memory Tracking (reserved=1858KB, committed=1858KB)
                            (malloc=6KB #80) 
                            (tracking overhead=1852KB)

-               Arena Chunk (reserved=2583KB, committed=2583KB)
                            (malloc=2583KB) 

-                   Logging (reserved=4KB, committed=4KB)
                            (malloc=4KB #179) 

-                 Arguments (reserved=17KB, committed=17KB)
                            (malloc=17KB #470) 

-                    Module (reserved=137KB, committed=137KB)
                            (malloc=137KB #1616)

我也不期望得到任何像样的性能,因为我想GC会经常运行这种设置,因为它没有很多空闲内存可以使用

 类似资料:
  • 我有一个Java程序可以在Solaris 10 X86上运行,具有2GB物理内存和2GB交换。 该程序在64位Linux中运行良好,仅消耗约450MB内存。 然而,当它在Solaris中运行时,它总是报告OutOfMemoryError,我注意到在错误发生之前,它正试图使用 那么为什么JVM会尝试使用那么多虚拟内存呢?有没有办法告诉JVM不要使用那么多虚拟内存? 谢谢你。 编辑: 谢谢大家的意见!

  • 问题内容: 我想问你如何减少Spring框架的RAM占用量。 我创建了一个简单的helloworld应用来演示该问题。只有两个类和context.xml文件: -主要方法课 -用于模拟某些“工作”的类(无穷循环中的printig Hello) 仅包含以下内容: 测试类仅包含称为的方法,构造后会调用: 我准备了两种情况,在这两种情况下,方法仅包含一行。 在第一种情况下,主要方法是这样做的: App在

  • 问题内容: 我正在尝试将几个文件加载到内存中。这些文件具有以下3种格式之一: 字符串TAB int 字符串TAB浮动 int TAB浮点数。 的确,它们是ngram静态文件,以防解决方案的出现。例如: 目前,我正在执行的伪代码是 令我惊讶的是,尽管磁盘中文件的总大小约为21 mb,但是将其加载到内存中时,该过程将占用120-180 mb的内存!(整个python应用程序不会将其他任何数据加载到内存

  • 问题内容: 这与Java AppengineAPPSTATS引起Java内存不足错误的问题有关。 Appstats似乎在128MB实例上导致java.lang.OutOfMemoryError,我想知道是否有减少日志记录量的方法。有没有办法从堆栈跟踪中过滤某些软件包名称? GAE API: 我的应用程序API: 不相关的: 这是可能由堆栈跟踪导致的OutOfMemoryError的堆栈跟踪: 对于

  • 问题内容: 我正在编写独立于操作系统的无锁队列,到目前为止,它工作得很好,但是内存管理方面的问题很小。我不确定它的gcc问题还是我的。问题:将元素添加到列表时,内存增加,但是从列表中删除元素(free(elementPointer);)时,内存使用率没有变化。 但是,当我使用pthreads时,N个生产者和M个消费者的 内存使用量始终约为10mb(当尝试添加和删除〜10kk元素时),因此看起来自由

  • 我有一个问题,为什么非常简单的Spring Boot应用程序分配100 MB内存?如何减少内存使用? 1) https://start.spring.io/生成带有“Spring Web Starter”依赖项的演示程序 2) Dockerfile pom.xml 类 1) 记忆测试1 Docker build-f Dockerfile-t demo. docker run-p 8080:8080