我想了解下java底层点相关技术不知从何下手?比方说我想实时监控我运行中的项目,那些类占用的过多的内存,生成了哪些对象,我由此可以判断它是否是造成内存泄漏的根源,这样比走查代码的代价要很多。简单说就是有没有java相关的API可以供我直接查看底层虚拟机相关详细信息,类似自己实现虚拟机jmap这样的工具,请了解的朋友给点思路,谢谢,jmap我个人感觉对查找内存泄漏并非很方便,它没有详细的告诉我是那个类的那个对象占用了那么大的内存。

解决方案 »

  1.   

    Java虚拟机规范(Java SE 7)
    这本书讲的很详细
      

  2.   

    实时监控程序占用内存,并不是去看虚拟机实现,了解虚拟机了,也不会知道当时你的项目里内存创建了多少对象,更不会看到每个对象占用多少内存啊。
    给一个小例子,之前论坛里粘过的。import java.lang.management.*;
    import java.io.*;class Test {
        public static void main(String[] args) {
            try {
                System.out.println(ManagementFactory.getRuntimeMXBean().getName());
                String pid = ManagementFactory.getRuntimeMXBean().getName().replaceAll("(\\d+)@.*", "$1");
                String cmd = "jmap -histo " + pid;
                System.out.println(cmd);
                final Process p = Runtime.getRuntime().exec(cmd);
                Thread t = new Thread() {
                    public void run() {
                        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
                        String buf;
                        try {
                            while ((buf=br.readLine()) != null) {
                                System.out.println(buf);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };
                t.start();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }输出格式为 num #instances #bytes class name请使有jdk1.6以上版本。
      

  3.   

    当然还是在JVM去控制对象这些的生成,了解虚拟机如何操作内存,统计内存使用。上面说的有点出入。
      

  4.   

    其实就是调用jmap去查看还可以查查这个类HotSpotVirtualMachine 
      

  5.   

    my god
    3L的代码好像是以前我给别人回帖时写的例子,该例子也是调用jmap查看的
    LZ可以参考java.lang.manager包和javax.management包下的类
    或者去下个jconsole源码研究吧
      

  6.   

    我觉得还是调用java自己的工具吧,最多给封装一层
      

  7.   

    可以看看java虚拟机规范,网上有第二版的中文译本(感谢翻译者们)