我正在编写一个java代码,我想运行一些性能测试。 我想获得我班上只有一种方法使用的堆内存。
public AccessControl {
public boolean Allowed () {
code
}
public void print () {
code }
}
我希望每次在运行时调用Allowed方法时获取java中使用的堆内存。我读过我可以通过HPROf做到但我注意到HPROf不提供方法的内存计算但只针对类是否有代码我可以在方法内写入以获取可用内存然后使用内存?感谢
答案 0 :(得分:1)
没有“方法使用的堆内存”这样的东西。方法不占用堆内存,对象做。
如果您对在特定方法中创建的对象感兴趣(当然,还有直接和间接调用的方法),您可以比较在方法调用之前和之后创建的堆快照(可以通过在调试器中运行来实现)并设置断点)。
但是你想解决的实际问题是什么?内存泄漏通常通过首先为明显不必要的对象查找GC根并使用调试器找出这些引用的设置位置和原因来诊断。
答案 1 :(得分:1)
InMemProfiler可用于配置内存分配。在跟踪模式下,此工具可用于identify the source of memory allocations。
您可以使用#tracetarget-org.yourcode.YourClass选项获取“Allocating Classes”输出,以显示YourClass中的每个方法内存分配。
但是,您只能分别为每个已分配的类分配内存分配。目前在所有已分配的课程中没有给出摘要。如果你非常热衷于git fork inMemProfiler并尝试添加此功能。
答案 2 :(得分:0)
我建议您在分析时不要通过引入新代码来偏向您的结果。如果HPROF无法解决您的问题,那么您可以使用调试器并在要分析的位置应用断点。您可能还想尝试JProfiler。我建议您不要只关注代码中的某个特定位置,而是先查看大图。否则,您可能会冒premature optimization。
答案 3 :(得分:0)
如果你使用oracle jvm,你可以做到!
ThreadMXBean threadmx = ManagementFactory.getThreadMXBean();
long startbyte = ((com.sun.management.ThreadMXBean)threadmx)
.getThreadAllocatedBytes(Thread.currentThread().getId());
//call method
int usedbyte = ((com.sun.management.ThreadMXBean)threadmx)
.getThreadAllocatedBytes(Thread.currentThread().getId())-startbyte;
答案 4 :(得分:0)
一种方法是使用像jprofiler这样的内存分析器,但如果你只想查看一组语句使用的内存,请使用下面的代码
Runtime runtime = Runtime.getRuntime();
long memoryUsedBefore = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Memory used before: " + memoryUsedBefore );
// set of memory consumption statements here
long memoryUsedAfter = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Total Memory increased:" + (memoryUsedAfter - memoryUsedBefore ));