我是java内存问题的新手,在调试java进程的内存使用时遇到了问题,需要你的帮助。根据“the java进程占用8G常驻内存和9.4G虚拟内存。这对于这个进程来说太多了,我想检查一下为什么它会吃掉内存。所以我使用jmap进行了一次堆转储(没有使用‘live’选项,因为它可能会触发GC ),发现只有100MB的活动对象,还有1.5G的不可达对象。那么剩下的6G内存去哪了?我应该检查哪些其他类型的非堆内存?此外,你能帮我用任何工具/ unix命令找到它吗?
JVM参数:-Xms是2G,-Xmx是8G
请让我知道我是否应该在这里添加更多的信息,给你更多的背景。
提前谢谢。
在Linux上,这可能会提供一些有用的信息:
pmap-x PID
有关< code>pmap的更多信息,请参见< code>man pmap
您还应该知道,Linux上使用glibc存在一个已知问题
解决方法是设置< code > export MALLOC _ ARENA _ MAX = 4
在Google上搜索MALLOC_ARENA_MAX或StackOverflow以获取更多信息。
您可能还需要调整其他malloc选项以优化分配内存的低碎片:
# tune glibc memory allocation, optimize for low fragmentation
# limit the number of arenas
export MALLOC_ARENA_MAX=2
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt"
export MALLOC_MMAP_THRESHOLD_=131072
export MALLOC_TRIM_THRESHOLD_=131072
export MALLOC_TOP_PAD_=131072
export MALLOC_MMAP_MAX_=65536
你告诉Java它可能需要8Gb,它确实做到了。也许你在一段时间内将JVM内部的内存使用量增加到8Gb;然后它垃圾收集并丢弃了价值6.4Gb的不可访问对象。但是JVM不会将这些内存返回给系统。
然而,当您的机器上的物理内存用完时,这些6.4Gb的未使用页面将被调出。你的机器内存还没有用完,所以它们仍然是RSS的一部分。至少,这是我有根据的猜测。
另请参阅:有没有办法在不使用时降低Java堆?
我们面临的问题是,Java进程的驻留内存逐渐增长。我们将Xmx定义为4096 MB,并且XX:MaxPermSize=1536m。活动线程的数量约为1500,定义了256K的Xss。 当应用服务器(JBoss 6.1)启动时,使用的驻留内存约为5.6GB(一直在使用top命令对其进行监视);它逐渐增长(每天约0.3到0.5 Gb),直到增长到约7.4 Gb,这时内核的OOM杀手由于RAM空间不足而
问题是,那些块是什么?哪个子系统分配这些? 更新:我们不使用JIT和/或JNI本机代码调用。
10.7 驻留程序 驻留程序TSR(Terminate but Stay Resident)是一种特殊应用程序,它在装入内存运行后,其部分代码仍然驻留在内存,当该段代码被激活时,它又进入运行状态。常用的驻留程序是作为某个中断处理程序的一部分,其激活条件就是系统产生了此中断的中断请求。 虽然驻留程序可根据具体的需要有不同的编写方式,但其典型结构包括以下几部分: 1、 保存、修改中断向量表; 2、 程
问题内容: 一个的类上堆和参考变量指向它创建。 如果我写的时候没看错 类的对象在堆上创建并指向它。在堆中,我们有两个单独的对象,其中包含它们自己的实例变量。 但是如果我写 还有两个将在堆上创建,一个用于,另一个用于。但仅提供参考 即可。谁指的是堆外层?如果没有任何引用引用它,那么它应该有资格进行垃圾回收,这将影响的使用。 问题答案: 内部类包含对其外部类实例的隐藏引用。如果没有其他引用,则该隐藏引
问题内容: 我们最近对生产系统的观察告诉我们Java容器的常驻内存使用量正在增长。关于此问题,我们已经进行了一些调查,以了解为什么Java进程使用pmap之类的本地工具会比堆+线程堆栈+共享对象+代码缓存+等消耗更多的内存。结果,我们发现本机进程(可能是malloc / mmap)分配了一些64M内存块(成对): 我将0000000720000000 3670016K的行解释为我们使用JVM参数“
我有几个线程在运行,每个线程都对HTTP工具包进行阻塞调用。我的代码一直在工作,但最近大约30分钟后就冻结了。我所有的线程都卡在以下一点上: