java 监控 native 内存_记一次java native memory增长问题的排查

1.摘要

最近排查了一个比较灵异的线上jvm内存持续增长的问题,排查过程异常艰辛,但是最后竟然是用最简单的办法搞定了……

2.现象

线上机器部署了两个java实例,在运行几天后java开始吃swap空间,java实例的内存占用接近7G,程序响应很慢,重启后又恢复正常。线上配置的堆内存为3600M,栈大小为512k。

3.排查

首先怀疑是java heap的问题,查看heap占用内存,没有什么特殊。

$ jmap -heap pid

然后又怀疑是directbuffer的问题,jdk1.7之后对directbuffer监控的支持变得简单了一些,使用如下脚本

发现directbuffer虽然在增长,但是也只有百兆左右。full gc之后缩小到十几兆,可以忽略。

import java.io.File;

import java.util.*;

import java.lang.management.BufferPoolMXBean;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServerConnection;

import javax.management.ObjectName;

import javax.management.remote.*;

import com.sun.tools.attach.VirtualMachine; // Attach API

/**

* Simple tool to attach to running VM to report buffer pool usage.

*/

public class MonBuffers {

static final String CONNECTOR_ADDRESS =

"com.sun.management.jmxremote.localConnectorAddress";

public static void main(String args[]) throws Exception {

// attach to target VM to get connector address

VirtualMachine vm = VirtualMachine.attach(args[0]);

St

你可能感兴趣的:(java,监控,native,内存)