tp如何选择java分配内存的方式?

tp如何选择java分配内存的方式?,java,memory,jvm,Java,Memory,Jvm,我知道不同的系统分配器,现在我正试图在JVM的上下文中使用它们。问题是,是否可以告诉hotspot使用哪个分配器(例如,我希望JVM使用tcmalloc执行所有分配,或者可能每次只调用mmap/munmap) 也许有一个JVM选项 jcmd VM.Native_内存显示的大小比RSS小得多 我会查看/proc/{pid}/smap,看看哪些区域是常驻的。您可以拥有大量虚拟内存,这些虚拟内存由线程堆栈使用,这些线程堆栈通常不驻留 如果java程序已经分配了大量堆外内存,那么将有DirectByte

我知道不同的系统分配器,现在我正试图在JVM的上下文中使用它们。问题是,是否可以告诉hotspot使用哪个分配器(例如,我希望JVM使用
tcmalloc
执行所有分配,或者可能每次只调用
mmap
/
munmap

也许有一个JVM选项

jcmd VM.Native_内存显示的大小比RSS小得多

我会查看
/proc/{pid}/smap
,看看哪些区域是常驻的。您可以拥有大量虚拟内存,这些虚拟内存由线程堆栈使用,这些线程堆栈通常不驻留


如果java程序已经分配了大量堆外内存,那么将有
DirectByteBuffer
对象来包装每个内存区域。

整个堆作为一个连续的内存块分配一次。您希望通过此实现什么?@PeterLawrey这意味着整个堆在启动时分配一次?正确,您的主要选项是开始时使用了多少堆,以及页面是否预先初始化。可能有很多原因。它们可以是所有线程的堆栈。如果您有一对看起来相同的映射,那么这些可以是通常不驻留的堆栈。我想看一下
/proc/{pid}/smap
了解更多详细信息,特别是哪些区域是常驻的。尝试使用或不使用分析功能的jemalloc。有趣。应用程序中的所有IO都是通过
DirectByteBuffer
执行的。但我认为它是由
jcmd VM.native_memory
@SomeName计算的是的,但这不包括Java堆,这是多少?我发现直接内存包含在
内部
部分。目前我有
内部(reserved=49394KB,committed=49394KB)Java堆(reserved=131072KB,committed=42496KB)
,这很合理。可能我需要分析这些匿名区域的
二进制转储
,以了解它们是什么。。。