我正在使用 Java Visual VM 的内存采样功能,但我无法回答以下问题:
为什么会创建这么多实例?
为什么这些实例数和字节数不断增加?
例如,我创建了一个非常简单的 Java 程序,如下所示:
public class TestMemory{
public static void main(String[] args) throws InterruptedException {
System.out.println("Hello");
Thread.sleep(60 * 60 * 1000);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在 Java Visual VM 中看到有 611 个类。实例数量不断从 25,000 增加到接近 50,000,然后又回落到 25,000 左右。实例减少的原因可能是由 GC 引起的,但我不知道为什么这些数字如此动态,即使我没有对我的程序做任何事情。
我的应用程序的性能有一些问题。我在 Stackoverflow 上找到了这个答案:https : //stackoverflow.com/a/378024/5363
我喜欢。我不太明白的一点是代码优化和分析之间的关系是什么。因为显然有人想要分析优化的代码,但同时在优化过程中会丢失很多信息。那么在调试器中运行优化的代码并按照引用的答案中的建议进入它是否可行?
我在 Linux 下使用带有 gcc 的 CMake,如果这有什么不同的话。
我想找到 plpgsql 函数中的瓶颈,所以我正在寻找一个分析器。
如何启用 PostgreSQL 函数分析器?建议加载plugin_profiler.dll库,但它是为 8.3 编写的,而 9.2 中似乎没有这样的东西
我还安装了http://git.postgresql.org/gitweb/?p=pldebugger.git;a=summary(包含在 9.2 中)中描述的调试器,但看不到任何使用它的方法作为分析员。
简单的“RAISE NOTICE”方法对我无效,因为该函数在 < 0.1 ms 内执行,但被多次调用。
我知道valgrind可以调用memcheck来进行内存泄漏检查,这种情况下编译出来的C++可执行程序必须包含调试信息。那么,如果我想使用 valgrind/callgrind 来执行分析,可执行文件是否必须包含调试信息?我运行了一个小测试,似乎 valgrind/callgrind 可以在没有调试信息的情况下发布可执行程序。有人可以确认吗?
我在 Visual Studio 2013 Update 4 中有一个 64 位项目。当我使用 Visual Studio 的内置 cpu 分析器对其进行分析时,它可以很好地收集数据。但是当我停止分析器时,它说:“Microsoft Visual Studio 无法创建诊断报告。”
输出窗口显示:
Profiling of '[Project name]' started.
[Project name] has exited.
Profiling of '[Project name]' stopped.
Diagnostics session stopped with errors.
An error occurred opening '%temp%\BD371444-95DE-4EF8-9433-A9D00C516579'. The formatting of the file is not supported by this version of Visual Studio. Please try again with a different file or a different version of Visual Studio.
Run Code Online (Sandbox Code Playgroud)
在列出的文件夹中,有 .etl 文件可以使用 Windows 性能分析器打开而不会出错。
我试过修复 Visual Studio 没有效果。
所以我向 btrace 介绍自己,但目前我没有从中得到任何输出。使用此脚本:
包 com.sun.btrace.samples;
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class AllLines {
@OnMethod(
clazz="/.*/",
location=@Location(value=Kind.LINE, line=-1)
)
public static void online(@ProbeClassName String pcn, @ProbeMethodName String pmn, int line) {
print(Strings.strcat(pcn, "."));
print(Strings.strcat(pmn, ":"));
println(line);
}
}
Run Code Online (Sandbox Code Playgroud)
这直接来自示例目录,只是出于绝望而更改了“clazz =“/。*/”,以打印出一些东西。没运气。
我指向 btrace 的 pid 是一个简单的 java 程序,我开发的只是为了测试目的,它在循环中调用某个方法。我正在通过 Eclipse 运行它。
任何想法我可能会错过什么?谢谢!
更新:打开调试模式,发现它挂在“调试:检查端口可用性:2020”。有任何想法吗 ?
我一直在阅读有关此处的分析,它使用net_http_pprof和此处的runtime_pprof 进行了解释。那么,这两者之间有什么区别,哪个应该优先于另一个。并且请不要粘贴给定链接中的概述定义
跟进我之前关于 Profiler 峰值的问题。我刚刚发现,如果我在 Unity3D 中启用深度配置文件选项,我可以看到GetComponent()调用 underScrollRect.LateUpdate()仅占用 2.4 MB 内存用于仅 5 个Scroll Rect组件的垃圾收集。从以下快照中可以明显看出,UnityComponent.GetComponent()在LateUpdate()导致性能问题的方法中调用了 4046 次。我的应用程序是 UI 密集型的,但是 GC 的 2.4MB 根本不可接受。

通常建议不要GetComponent()在任何更新方法中使用,但 Unity 自己的实现违反了约定。这限制了我在一个场景中可以拥有的 UI 项的数量,以避免性能问题。
请注意,当我激活菜单对象时,此分析数据仅来自框架。
是否有任何解决方法可以减少/节省 2.4MB 的内存?
optimization performance profiling garbage-collection unity-game-engine
查看方法“methodExit”。参数“@Duration long time”中包含哪些时间单位?
package com.sun.btrace.samples;
import com.sun.btrace.Profiler;
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
import java.awt.EventQueue;
import java.awt.AWTEvent;
import java.awt.event.FocusEvent;
@BTrace
public class AllMethods {
@OnMethod(
clazz="java.awt.EventQueue",
method="dispatchEvent",
location=@Location(Kind.RETURN))
public static void methodExit(@Duration long time, @ProbeMethodName String pmn) {
println(pmn + " " + (time / 1000000));
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 CPU 上分析一组进程。为了非常精确,我想使用perf stat命令来查看我的进程使用了多少 CPU 周期。这与 top 不同,在那里我只看到快照中使用的 CPU 百分比。
不幸的是,我没有找到同时分析多个进程的方法。这可能吗?
作为第二个问题:是否可以不仅看到使用的 CPU 周期,还可以看到在同一时间间隔内使用的 CPU 周期总量(或百分比)?
profiling ×10
btrace ×2
c++ ×2
java ×2
linux ×2
optimization ×2
performance ×2
command-line ×1
eclipse ×1
go ×1
perf ×1
plpgsql ×1
postgresql ×1
sampling ×1
valgrind ×1
visualvm ×1