我发现我的一个spring boot项目的内存(RAM消耗)一天天增加。当我将 jar 文件上传到 AWS 服务器时,它占用了 582 MB 的 RAM(最大分配的 RAM 为 1500 MB),但每天,RAM 增加 50MB 到 100 MB,而今天 5 天后,占用了 835 MB . 现在该项目有 100-150 个用户,并且正常使用 Rest API。
由于 RAM 的增加,有几次应用程序出现以下错误(从日志中发现的错误):
Exception in thread "http-nio-3384-ClientPoller" java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)
所以为了解决这个问题,我发现通过使用 JAVA Heap Dump,我可以找到占用内存的对象/类。因此,通过Jmap在命令行中使用,我创建了一个堆转储并将其上传到Heap Hero和Eclipse Memory Analyzer Tool。在他们两个中,我发现了以下内容:
1.总浪费内存为:64.69MB (73%)(查看下面的截图)
2 . 其中,34.06MB 被Byte [] array和LinkedHashmap[](检查下面的截图)占用,我从未在我的整个项目中使用过。我在我的项目中搜索了它,但没有找到。
3 . 以下 2 个大对象分别占用 32 MB 和 20 MB。
1. Java Static …Run Code Online (Sandbox Code Playgroud) 我 100% 了解 JVM 的陷阱以及在 JVM 世界中为了解容器的人体工程学/资源而取得的进步/进步。另外,是的,我知道 Java 在默认情况下会尝试分配它运行的环境中可用 RAM 的 1/4...
所以我有一些想法和问题。我制定了 50/50 规则。如果我的应用程序需要 1GB 的 Xmx,那么我创建了 2GB 的容器,它为 JVM 开销和任何容器/交换的东西提供了另外 1GB 的 RAM(虽然不确定交换在容器中是如何真正工作的)。
所以我在想,如果我的应用程序需要 6GB 的 Xmx,我真的需要创建 12GB 的容器还是可以使用 7GB 或 8GB 的容器?当涉及到 RAM 时,我们需要在容器内部留出多少空间?
TreeMap<Long, Long>充满 1000 个(全部唯一)键值对的集合需要多少内存?
是的,我可以只观察内存转储,但需要详细了解原因:
Long= n 字节Entry<Long, Long > = 2n 字节,因此 1000 个条目 = 2000n 字节总计: X ?
假设一个方法返回一个字符串
String str = methodCall();
methodCall() 的返回类型是 String。
我们会得到一个字符串文字,它会在池内存中还是只是一个字符串对象?
java garbage-collection memory-management string-pool java-heap
java ×4
java-heap ×4
containers ×1
docker ×1
heap-dump ×1
spring-boot ×1
string-pool ×1
treemap ×1