小编Fra*_*ens的帖子

Java VisualVM为CPU分析提供了奇怪的结果 - 还有其他人遇到过这种情况吗?

我编写了这个小型(并且效率低下)的类,并希望使用Java VisualVM对其进行概要分析.

public class Test {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.readLine();
        int n = Integer.parseInt(args[0]);
        int fib = fib(n);
        System.out.println(fib);
    }

    private static int fib(int n) {
        if (n < 2) {
            return n;
        }
        return fib(n-1)+fib(n-2);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果很奇怪.调用ConnectionHandler.run()完全控制了结果.

(98.2%)sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run()
(1.7%)java.lang.Thread.join(long)
(0%)java.lang.String.equals(Object)
等. .

可能有大约一百个方法分析,其中没有一个是fib(int)!

我的程序实际上将所有时间花在这些方法上是不可思议的.他们似乎是连接到我的jvm并做其事情的探查器.

我究竟做错了什么?

为清晰起见进行了编辑:如果你传入了45个n,那么这个应用程序将运行20个简单的秒.我最初分析的程序(不是斐波纳契计算器)将我的cpu上的所有四个核心固定为100%,并且我正在进行持续长达5分钟的分析运行.这些具有相同的结果,并且我的应用程序中的方法在热点方法列表中没有出现.

它随着运行而变化,但ConnectionHandler.run()始终位于顶部,通常占配置文件时间的~99%.

第二次编辑:我尝试过使用采样器,现在我得到的结果与JProfiler正在生成的结果一致.这样做的缺点是我没有得到分析带来的堆栈跟踪信息.但对于我的迫切需求,这是非常好的.

我在玩游戏时发现的东西是VisualVM在分析它们时计算方法调用的挂钟时间.

在我的特定情况下,我的应用程序有一个主线程,它启动工作线程并立即阻止等待队列上的消息.

这意味着阻塞方法似乎几乎占据了探查器的所有时间,尽管这种方法不是占用了我的CPU.

我希望sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run()方法能够很好地完成它的工作 - 但是当它终止时它会成为我应用程序中运行时间最长的方法之一 - 反复出现.

java profiling visualvm

21
推荐指数
1
解决办法
7109
查看次数

Java中的不可变bean

我非常好奇为java bean提供不变性的可能性(这里的bean我指的是带有空构造函数的类,为成员提供getter和setter).显然,这些类不是不可变的,并且它们用于从数据层传输值,这似乎是一个真正的问题.

StackOverflow中已经提到了一种解决这个问题的方法,称为"C#中的不可变对象模式",其中对象在完全构建后被冻结.我有另一种方法,并且非常希望听到人们对此的看法.

该模式涉及两个类Immutable和Mutable,其中Mutable和Immutable都实现了一个提供非变异bean方法的接口.

例如

public interface DateBean {
    public Date getDate();
    public DateBean getImmutableInstance();
    public DateBean getMutableInstance();
}

public class ImmutableDate implements DateBean {
    private Date date;

ImmutableDate(Date date) {
    this.date = new Date(date.getTime());
}

public Date getDate() {
    return new Date(date.getTime());
}

    public DateBean getImmutableInstance() {
        return this;
    }

    public DateBean getMutableInstance() {
        MutableDate dateBean = new MutableDate();
        dateBean.setDate(getDate());
        return dateBean;
    }
}

public class MutableDate implements DateBean {
    private Date date;

public Date getDate() {
    return date; …
Run Code Online (Sandbox Code Playgroud)

concurrency immutability javabeans

5
推荐指数
1
解决办法
2505
查看次数