我正在使用一个使用嵌入式tomcat服务器的Springboot应用程序。应用程序需要800MB以上的RAM。那是常见的吗?有什么方法可以降低内存使用率吗?
答案 0 :(得分:1)
tomcat消耗的内存量完全取决于您的应用程序要求。 您需要对应用程序进行某种内存分析。
这是常见的吗?
是的,我可以。这完全取决于您的应用程序,创建对象的方式以及对象使用的内存量。
您可以先将-Xms置于1GB并运行应用程序并执行正常操作。 使用JVisualVm或JConsole等工具来观察堆大小和GC性能,以及JVM中不同类型对象消耗的内存量。
这将为您提供一个初步的想法,了解您的应用程序所需的堆数量。 在此之后使用JMeter之类的工具来加载测试应用程序,检查负载如何妨碍您的堆使用。
建议阅读: http://blog.manupk.com/2012/09/java-memory-model-simplified.html
答案 1 :(得分:0)
这很常见。 Java VM非常繁重。查看JVM启动标志,它将告诉你堆大小可以增长到什么(你可能会看到类似-Xmx768m
的东西,它最多分配768M的堆)。您可以尝试设置CATALINA_OPTS
环境变量:CATALINA_OPTS=-Xmx512m
,但如果引导VM的springboot脚本会覆盖此项,则必须跟踪脚本中设置的值。但是,默认值通常很有效,并且如果您开始实例化需要花费一段时间进行垃圾回收的许多或大型(读取:hibernate)对象,则会阻止JVM丢失内存错误。
答案 2 :(得分:0)
有没有办法降低内存使用率?
有两种方法:
您可以尝试"挤压"堆大小。这是不推荐的,因为它导致JVM在GC中占用更大比例的CPU,更频繁地停止GC,最终是OOME。
这种方法通常根本不起作用;即它只会导致应用程序死得更快。
您可以找出应用程序使用如此多内存的原因。这可能是由于很多事情:
我同意@ cowbert的建议。使用性能监视工具尝试跟踪使用大多数JVM内存的内容。如果存在内存泄漏,这通常会显示为用于某些类型对象的意外大量内存。