我很难找到一些程序来跟踪Java程序的执行。
对于初学者来说,能够像所有方法调用一样给我带来好处的东西,以及花费在每次调用上的时间都很好。
您有什么建议吗?预先谢谢你
编辑:我想从启动开始就花费整个时间来获取整个调用树或层次结构,无论它的确切名称是什么,而我却无法通过VisualVM获得它。 我找到了一些工具的屏幕快照,这些工具本来可以做到的,但是我还没有完成,我想从以下开始更简单一些:
那将与我的想法非常接近:它给出了一些方法调用树的痕迹,每个方法所花费的时间,甚至是它的表示形式。
我要解决的原始问题是什么?这几乎是整个故事: 首先,我正在研究一些必须填充一些知识库的工具。我最近意识到这非常慢(某些特定的请求,即向基础中添加〜30个实体将花费20秒钟以上的时间),因此我想知道时间是否花在了我的代码上,在网络上(REST调用以更新该知识库),知识库本身或我的代码中。 如果我的代码很慢,我想知道它到底在做什么,这会花费很多时间。
另一个原因是,我正在阅读很棒的书“有效的Java第三版”。在项目6“避免创建不必要的对象”
有以下代码段:
// Hideously slow! Can you spot the object creation?
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
与之相比:
private static long sum() {
long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
我可以看到他的第二版将花费更少的时间,我理解为什么,没有实例化Long对象,等等。但是我想通过实际的措施来看实例化实际花费了多长时间,请参见测量Long对象实例的数量,正在创建其他对象,在这种情况下Long对象所占内存的百分比等。
以及其他一些在工作中的经验,我们会盲目地进行大量的重构,对于某些实施X是否比实施Y更“有效”的问题引起了激烈的争论,但实际上我们从来没有任何数据可以支持它。
总而言之,我意识到我需要工具来获取有关代码正在执行的内容,JVM中正在发生的事情,正在分配多少内存,由哪个对象分配,正在花费多少时间的真实且可靠的数据什么,等等。
其中包含很多具体问题,而我的第一个问题是: “我怎么能追踪一个简单的程序的执行情况。”
谢谢,很抱歉,我一开始并没有那么具体。
另外一个建议的帖子并没有多大帮助,将VisualVM与插件Profile Startup一起使用时,在来自有效Java的玩具示例中,当我算上Integer.MAX_VALUE时,我可以得到一些东西
但是,例如,如果我仅计数到1.000.000,则它看起来好像VisualVM没有时间开始(尽管我认为使用-agentpath:/ home / joseph / dev / visualvm_142 / profiler选项启动程序) /lib/deployed/jdk16/linux-amd64/libprofilerinterface.so=/home/joseph/dev/visualvm_142/profiler/lib,5140会让VisualVM启动,但我得到的只是一个空白屏幕,显示“状态:分析处于不活动状态”,但是都和我指望Integer.MAX_VALUE的执行相同,我只是不明白):