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

这些java本机内存从哪里分配?

孙朗
2023-03-14

JDK版本是热点8U_45

我研究了java进程的本地内存。本机内存甚至比堆占用更多的空间。然而,有许多本机内存块,这使我感到困惑。pmap-x的结果,例如:

00007f8128000000   65508   25204   25204 rw---    [ anon ]
00007f812bff9000      28       0       0 -----    [ anon ]
00007f812c000000   65508   24768   24768 rw---    [ anon ]
00007f812fff9000      28       0       0 -----    [ anon ]
00007f8130000000   65508   25532   25532 rw---    [ anon ]
00007f8133ff9000      28       0       0 -----    [ anon ]
00007f8134000000   65524   22764   22764 rw---    [ anon ]
00007f8137ffd000      12       0       0 -----    [ anon ]
00007f8138000000   65508   26456   26456 rw---    [ anon ]
00007f813bff9000      28       0       0 -----    [ anon ]
00007f813c000000   65508   23572   23572 rw---    [ anon ]
00007f813fff9000      28       0       0 -----    [ anon ]
00007f8140000000   65520   23208   23208 rw---    [ anon ]
00007f8143ffc000      16       0       0 -----    [ anon ]
00007f8144000000   65512   23164   23164 rw---    [ anon ]
00007f8147ffa000      24       0       0 -----    [ anon ]
00007f8148000000   65516   23416   23416 rw---    [ anon ]
00007f814bffb000      20       0       0 -----    [ anon ]
00007f814c000000   65508   23404   23404 rw---    [ anon ]
00007f814fff9000      28       0       0 -----    [ anon ]
00007f8150000000   65512   24620   24620 rw---    [ anon ]
00007f8153ffa000      24       0       0 -----    [ anon ]
00007f8154000000   65536   23976   23976 rw---    [ anon ]
00007f8158000000   65508   23652   23652 rw---    [ anon ]
00007f815bff9000      28       0       0 -----    [ anon ]
00007f815c000000   65508   23164   23164 rw---    [ anon ]
00007f815fff9000      28       0       0 -----    [ anon ]
00007f8160000000   65508   23344   23344 rw---    [ anon ]
00007f8163ff9000      28       0       0 -----    [ anon ]
00007f8164000000   65508   24052   24052 rw---    [ anon ]
00007f8167ff9000      28       0       0 -----    [ anon ]
00007f8168000000  131052   48608   48608 rw---    [ anon ]
00007f816fffb000      20       0       0 -----    [ anon ]
00007f8170000000   65516   23056   23056 rw---    [ anon ]
00007f8173ffb000      20       0       0 -----    [ anon ]
00007f8174000000   65516   26860   26860 rw---    [ anon ]
00007f8177ffb000      20       0       0 -----    [ anon ]
00007f8178000000   65508   23360   23360 rw---    [ anon ]
00007f817bff9000      28       0       0 -----    [ anon ]
00007f817c000000   65536   24856   24856 rw---    [ anon ]
00007f8180000000   65512   23272   23272 rw---    [ anon ]
00007f8183ffa000      24       0       0 -----    [ anon ]
00007f8184000000   65508   23688   23688 rw---    [ anon ]
00007f8187ff9000      28       0       0 -----    [ anon ]
00007f8188000000   65512   24024   24024 rw---    [ anon ]
00007f818bffa000      24       0       0 -----    [ anon ]
00007f818c000000   65508   25020   25020 rw---    [ anon ]
00007f818fff9000      28       0       0 -----    [ anon ]
00007f8190000000   65512   22868   22868 rw---    [ anon ]
00007f8193ffa000      24       0       0 -----    [ anon ]
00007f8194000000   65508   24156   24156 rw---    [ anon ]
00007f8197ff9000      28       0       0 -----    [ anon ]
00007f8198000000   65508   23684   23684 rw---    [ anon ]

有许多占地约64m的街区。

dump binary memory mem.bin from to

那么如何跟踪这些内存块的来源呢?

共有1个答案

汤昊
2023-03-14

使用jemalloctcmalloc-它们都有内置的分配探查器,有助于识别分配的来源。

由于许多原因,Java进程可能会使用太多的本机内存。流行的原因是

  • 直接字节缓冲区
  • unsafe.allocateMemory
  • 分配的内存
  • 未关闭的资源(例如ZipinputStream)
  • 其他本地库
 类似资料:
  • 大家好,我有一个关于Java继承的具体问题。以下是我的代码 现在我的问题是,运行这个程序时,幕后到底发生了什么。 什么会遗传? 内存位置在哪里? 为什么第一个syso给4,第二个给5?(这一点我能在一定程度上理解,但澄清上述两个将有助于更清楚地理解它) 请引导

  • 问题内容: 如果您运行的代码调用Java中的本机库,那么当内存分配应在对象的生存期内持续时,释放这些库分配的内存的常用方法是什么?在C ++中,我将使用析构函数,但是Java从来没有真正使用过析构函数,现在更少了。 我最感兴趣的特定情况是JOCL,其中有一个对象,该对象包装了已编译的OpenCL内核及其所有始终相同的参数。表示已编译内核和参数的结构都在库侧分配,JOCL提供了一种方法,您可以调用该

  • 我刚刚尝试在Android 4.0设备上运行使用Java8编译的应用程序。虽然我习惯于非常小心地查看Android留档中的Android API级别,以确保我只使用Android 4.0上可用的API,但我不太习惯于确保我没有使用Android 4.0上不可用的Java功能。 考虑以下代码,它试图从视图类导入initializeScrollbars()API,因为无论出于何种原因,它已从官方SDK

  • 问题内容: 在工作中,我们的目标平台之一是运行Linux的资源受限小型服务器(内核2.6.13,基于旧的Fedora Core的自定义发行版)。该应用程序是用Java(Sun JDK 1.6_04)编写的。Linux OOM杀手配置为在内存使用量超过160MB时杀死进程。即使在高负载下,我们的应用程序也永远不会超过120MB,并且与其他活动的本机进程一起,我们也始终保持在OOM限制内。 但是,事实

  • 问题内容: 有什么工具可以知道我的Java应用程序已使用了多少个本机内存?我的应用程序内存不足:当前设置是:-Xmx900m 计算机,Windows 2003 Server 32位,RAM 4GB。 还在Windows上将boot.ini更改为/ 3GB,会有什么不同吗?如果设置为Xmx900m,则可以为此进程分配多少最大本机内存?是1100m吗? 问题答案: (就我而言,我使用的是Java 8)

  • 我有一个从我的供应商products下载的文件。xml。我有一个脚本从这个文件中获取数据并将其放入csv文件中。 所以我正在看这个脚本,似乎有从xml中提取的数据,我在任何xml编辑器中都看不到。比如图像和类别。另一方面,我看到xml文件中的某些字段在应该放在csv中的时候没有放在csv中,比如产品名称。 除了添加产品名称和描述之外,它做的一切都是正确的。 这里是脚本将数据从xml抓取到数组中的地