- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在针对在 ECS/EC2/Docker/Centos7/Tomcat/OpenJDK8 环境中运行的 Java Web 应用程序进行性能测试时,我观察到 JVM 内存中有一个大的离散峰值。
性能测试非常简单,它包括对位于 Elastic Container Service 管理的 EC2 主机上运行的一对 Docker 容器前面的 AWS Application Load Balancer 的连续并发请求。通常,并发级别是 30 个并发负载测试客户端连接/线程。几分钟之内,其中一个 Docker 容器通常会受到影响。
内存峰值似乎出现在非堆内存中。具体来说,内存峰值似乎与 Arena Chunk
内存空间有关。比较未经历峰值的 JVM 和已经历峰值的 JVM 的内存占用时,Thread
和 Arena Chunk
内存空间脱颖而出。
下面是 VM internal memory 的比较使用 jcmd
实用程序。
请注意 Arena Chunk
内存和相对较高的 Thread
内存数量。
测试的并发级别可以对Tomcat请求线程池中的线程产生即时需求。但是,峰值并不总是出现在第一波请求中。
你见过类似的东西吗?您知道是什么导致了峰值吗?
内存峰值容器:
Mon Oct 9 00:31:45 UTC 2017
89440337e936 27.36% 530 MiB / 2.93 GiB 17.67% 15.6 MB / 24.1 MB 122 MB / 2.13 MB 0
Mon Oct 9 00:31:48 UTC 2017
89440337e936 114.13% 2.059 GiB / 2.93 GiB 70.29% 16.3 MB / 25.1 MB 122 MB / 2.13 MB 0
普通容器:
Mon Oct 9 00:53:41 UTC 2017
725c23df2562 0.08% 533.4 MiB / 2.93 GiB 17.78% 5 MB / 8.15 MB 122 MB / 29.3 MB 0
Mon Oct 9 00:53:44 UTC 2017
725c23df2562 0.07% 533.4 MiB / 2.93 GiB 17.78% 5 MB / 8.15 MB 122 MB / 29.3 MB 0
内存峰值 JVM:
# jcmd 393 VM.native_memory summary
393:
Native Memory Tracking:
Total: reserved=1974870KB, committed=713022KB
- Java Heap (reserved=524288KB, committed=524288KB)
(mmap: reserved=524288KB, committed=524288KB)
- Class (reserved=1096982KB, committed=53466KB)
(classes #8938)
(malloc=1302KB #14768)
(mmap: reserved=1095680KB, committed=52164KB)
- Thread (reserved=8423906KB, committed=8423906KB)
(thread #35)
(stack: reserved=34952KB, committed=34952KB)
(malloc=114KB #175)
(arena=8388840KB #68)
- Code (reserved=255923KB, committed=37591KB)
(malloc=6323KB #8486)
(mmap: reserved=249600KB, committed=31268KB)
- GC (reserved=6321KB, committed=6321KB)
(malloc=4601KB #311)
(mmap: reserved=1720KB, committed=1720KB)
- Compiler (reserved=223KB, committed=223KB)
(malloc=93KB #276)
(arena=131KB #3)
- Internal (reserved=2178KB, committed=2178KB)
(malloc=2146KB #11517)
(mmap: reserved=32KB, committed=32KB)
- Symbol (reserved=13183KB, committed=13183KB)
(malloc=9244KB #85774)
(arena=3940KB #1)
- Native Memory Tracking (reserved=1908KB, committed=1908KB)
(malloc=8KB #95)
(tracking overhead=1900KB)
- Arena Chunk (reserved=18014398501093554KB, committed=18014398501093554KB)
(malloc=18014398501093554KB)
- Unknown (reserved=38388KB, committed=38388KB)
(mmap: reserved=38388KB, committed=38388KB)
普通 JVM:
# jcmd 391 VM.native_memory summary
391:
Native Memory Tracking:
Total: reserved=1974001KB, committed=710797KB
- Java Heap (reserved=524288KB, committed=524288KB)
(mmap: reserved=524288KB, committed=524288KB)
- Class (reserved=1096918KB, committed=53738KB)
(classes #9005)
(malloc=1238KB #13654)
(mmap: reserved=1095680KB, committed=52500KB)
- Thread (reserved=35234KB, committed=35234KB)
(thread #35)
(stack: reserved=34952KB, committed=34952KB)
(malloc=114KB #175)
(arena=168KB #68)
- Code (reserved=255261KB, committed=35237KB)
(malloc=5661KB #8190)
(mmap: reserved=249600KB, committed=29576KB)
- GC (reserved=6321KB, committed=6321KB)
(malloc=4601KB #319)
(mmap: reserved=1720KB, committed=1720KB)
- Compiler (reserved=226KB, committed=226KB)
(malloc=96KB #317)
(arena=131KB #3)
- Internal (reserved=2136KB, committed=2136KB)
(malloc=2104KB #11715)
(mmap: reserved=32KB, committed=32KB)
- Symbol (reserved=13160KB, committed=13160KB)
(malloc=9221KB #85798)
(arena=3940KB #1)
- Native Memory Tracking (reserved=1890KB, committed=1890KB)
(malloc=8KB #95)
(tracking overhead=1882KB)
- Arena Chunk (reserved=178KB, committed=178KB)
(malloc=178KB)
- Unknown (reserved=38388KB, committed=38388KB)
(mmap: reserved=38388KB, committed=38388KB)
最佳答案
A glibc/malloc option似乎修复了这个 MALLOC_PER_THREAD=0
。但是,我决定使用 debian/openjdk docker base image而不是 centos,这也解决了这个问题。
关于java - Docker 容器 - JVM 内存峰值 - Arena block 内存空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46638821/
使用 bull-arena: "^3.2.2"版本。在启动竞技场仪表板时遇到此错误 TypeError: as of 3.0.0, bull-arena requires that the queue
使用 bull-arena: "^3.2.2"版本。在启动竞技场仪表板时遇到此错误 TypeError: as of 3.0.0, bull-arena requires that the queue
http://stackoverflow.com/questions/11276668/mac-os-does-not-open-topcoder-arena-to-open上有同样的问题,但我无法解
const int size = 50000; char pool[size]; int freeMemory(void) { int freemem = 0; for(int i = 0; i <
我有一个使用 Arena 的结构: struct Foo { a: Arena, // from the typed-arena crate v: Vec, } 只要受主结构体生命周期
我无法在我的 Mac 上运行 topcoder arena.. 当我尝试从 safari 登录 topcoder 时,它说找不到 Java。 所以我下载了.jnlp...但仍然无法运行 这是我的 Ja
我有一个包含字符串字段的结构。我想控制字符串的内存分配方式。特别是,我想使用类似 copy_arena 的方式来分配它们。 . 也许我可以制作自定义 ArenaString 类型,但我不知道如何将对
当我在 MRuby 代码中进行救援时,我收到此错误: arena overflow error 我不熟悉这个术语以及如何解决它。这是我的 C 程序的示例: while (true) { SDL_E
我正在评估 Protobuf Arena 分配以与非 protobuf 相关的类一起使用。就像一个从内存池中轻松分配/释放对象的工具。 我没有在它的 API ( https://developers.
我尝试安装一个名为 EclipseCoder 的插件以通过 Eclipse(用于 c/c++)运行 Topcoder arena,但它不起作用并抛出错误。我做了以下。 我为 C/C++ 安装了 Ecl
我在 topcoder 网站上注册,然后继续下载该小程序。发生的情况是我无法安装它,它说 your security settings have blocked an application wi
我正在运行带有最新版本 Java 的 Mac OX 10.7.4。我想访问 TopCoder 的竞技场,所以我下载了 .jnlp 并尝试打开它。但是,我不断收到一条错误消息,指出该应用程序未签名。我附
任何对 glibc malloc 代码有一些基本想法的人都可以告诉我如何遍历所有 arenas 并找出哪些块没有被释放,即它们的 inuse 位已设置。这是我在退出进程时必须做的。 或者 更确定的是,
在过去一周左右的时间里,我一直在调查内存使用量随时间累积的应用程序中的问题。我将其缩小到复制 a std::vector > > > > > 在工作线程中(我意识到这是一种组织内存的荒谬方式)。定期地
在针对在 ECS/EC2/Docker/Centos7/Tomcat/OpenJDK8 环境中运行的 Java Web 应用程序进行性能测试时,我观察到 JVM 内存中有一个大的离散峰值。 性能测试非
在 OpenBSD 上使用命令“ksh all.bash”编译 golang 时出现错误“无法保留 arena 虚拟地址空间”(也尝试过 make.bash 但没有成功)。这是输出: $ ksh al
我是一名优秀的程序员,十分优秀!