java 虚拟机内存占用超出 -Xmx设置

张凯丰 发布于 2014/02/13 10:42
阅读 4K+
收藏 2

Serverless 架构就不要服务器了?>>>

现在有一台机器运行的jboss5.1,java jdk 1.6.0.22, 现在的问题是 交换空间不存

java 虚拟机只分配了 9G 内存,可以通过top查看 此java 占用了 物理内存30G,VIRT:54G, 初步怀疑是 directMemory 有问题,通过获取  java.nio.Bits 获取到最大的directMemory也就只有9G,现在程序运行几个小时,交换空间就不足了。同时 通过 IOSTAT 存看 文件读取比较多,不能定位到具体的文件。希望 大家帮我看看,可能的问题出在哪呢?

内存分配

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 9755951104 (9304.0MB)
   NewSize          = 3196059648 (3048.0MB)
   MaxNewSize       = 3196059648 (3048.0MB)
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 65536
   PermSize         = 524288000 (500.0MB)
   MaxPermSize      = 1069547520 (1020.0MB)
New Generation (Eden + 1 Survivor Space):
   capacity = 3195994112 (3047.9375MB)
concurrent mark-sweep generation:
   capacity = 6558842880 (6255.0MB)
Perm Generation:
   capacity = 524288000 (500.0MB)

jstat

 S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00 100.00  47.27  27.74    251    6.620     0    0.000    6.620

iostat

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.52    0.00    0.42    0.17    0.00   97.88


Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              31.21       942.32      1699.66  122962666  221789066

top

top - 09:27:14 up 1 day, 12:14,  2 users,  load average: 10.77, 4.36, 1.75
Tasks: 139 total,  17 running, 122 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.5%us,  0.3%sy,  0.0%ni, 97.9%id,  0.2%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  32721528k total, 32509208k used,   212320k free,     5332k buffers
Swap: 16383992k total, 12237888k used,  4146104k free,    30064k cached


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                               
29068 root      20   0 53.8g  29g 6296 R 91.1 95.7   0:10.95 java 

vmstat

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
20  2 12365972 209692   5056  30432   15   31    20    36    8    4  2  0 98  0  0

DirectMemory:

总的: 9355395072B
占用的: 39220224B 


加载中
0
DanielTo
DanielTo
dump 内存映像出来,用MAT定位原因
0
pckingchrrity
pckingchrrity

java nio占用的内存 应该是 操作系统缓冲区,NIO中的Buffer 将文件部分或者全部映射到内存后进行读写 还有它的实现不是纯java的代码,而是本地(native)代码.它内存的分配不在Java的堆栈中,不受java内存回收的影响 。

 -XX:MaxDirectMemorySize=2048M,直接内存DirectMemory的大小默认为 -Xmx 的JVM堆的最大值,但是并不受其限制,而是由JVM参数 MaxDirectMemorySize单独控制

自己配置试试吧

0
张凯丰
张凯丰
通过设置   -XX:MaxDirectMemorySize=1024M 以后,还是会出现同样问题,strace 命令有跟踪内存分配的吗? 
0
张凯丰
张凯丰

查看 /proc/pid/smaps 文件  存在一个 很异常,如下

7f1480021000-7f1484000000 ---p 00000000 00:00 0 
Size:              65404 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
这个有374个,65M*374=24G,和这个 有关系吗?这是什么映射的?

0
Smilewdwdxx
Smilewdwdxx
你好,请问这个问题解决了吗。
返回顶部
顶部