我正在使用 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 引起的,但我不知道为什么这些数字如此动态,即使我没有对我的程序做任何事情。
我想知道在调试时是否可以知道使用Visual Studio 2013加载了多少个类型的对象.我目前正在使用C#进行开发.
在简单的情况下,它只是对几行代码的强烈盯着是微不足道的:
class A {
var b: B?
}
class B {
var a: A?
}
var a = A()
var b = B()
a.b = b
b.a = a
Run Code Online (Sandbox Code Playgroud)
如何解决> 50k行代码项目的这个问题(从Objective-C/C++移植).例如,有没有办法开发一个工具来在运行时遍历对象图(就像在Java/C#世界中那样)?
我正在使用memory_profiler来分析我的代码
from memory_profiler import profile
@profile
def whatever():
....
....
Run Code Online (Sandbox Code Playgroud)
所以,正如你们许多人可能知道我在屏幕上得到类似这样的输出:
Line # Mem usage Increment Line Contents
==============================================
3 @profile
4 5.97 MB 0.00 MB def my_func():
5 13.61 MB 7.64 MB a = [1] * (10 ** 6)
6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7)
7 13.61 MB -152.59 MB del b
8 13.61 MB 0.00 MB return a
Run Code Online (Sandbox Code Playgroud)
我的问题是:
由于@profile进程需要花费很多时间,因此我想知道我是否可以以某种方式记录/存储此输出,并让脚本保持运行,可能是在晚上.
我的想法是在许多def函数中使用装饰器@profile,并将所有结果以某种方式存储在单个TXT或许多不同的TXT文件中,这不是重要的,重要的是如果可能的话.
有没有一种简单的方法来测量 Racket 程序的内存使用情况?我正在尝试并行运行许多程序,并且我想确保每个程序都有足够的内存。
版本:0.50.0
在官方文档中。该博客有一个链接,它指导我如何制作每个函数的内存使用情况图。但是当我尝试运行本文中的确切代码时。
测试1.py
import time
@profile
def test1():
n = 10000
a = [1] * n
time.sleep(1)
return a
@profile
def test2():
n = 100000
b = [1] * n
time.sleep(1)
return b
if __name__ == "__main__":
test1()
test2()
Run Code Online (Sandbox Code Playgroud)
命令是:
mprof run test1.py
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
回溯(最近一次调用最后一次):
文件“test.py”,第 3 行,@profile NameError:名称“profile”未定义
这很奇怪,因为有官方的引用:
警告
如果您的 Python 文件从 memory_profiler import profile 导入内存分析器,则不会记录这些时间戳。注释掉导入,保留您的函数,然后重新运行。
因此,如果我想要每个函数的内存使用情况图,我需要注释掉 from memory_profiler import profile,但是当我注释掉它时,出现错误。
我正在使用 LeakCanary,但堆分析结果没有提供足够的信息来检测任何泄漏。它只提到活动正在泄漏。
\nD/LeakCanary: \xe2\x80\x8b\n ====================================\n HEAP ANALYSIS RESULT\n ====================================\n 1 APPLICATION LEAKS\n \n References underlined with "~~~" are likely causes.\n Learn more at https://squ.re/leaks.\n \n 298153 bytes retained by leaking objects\n Signature: a610bac3ef989ac5dc5a69244fc2882de5617\n \xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n \xe2\x94\x82 GC Root: System class\n \xe2\x94\x82\n \xe2\x94\x9c\xe2\x94\x80 android.provider.FontsContract class\n \xe2\x94\x82 Leaking: NO (MyApplication\xe2\x86\x93 is not leaking and a class is never leaking)\n \xe2\x94\x82 \xe2\x86\x93 static FontsContract.sContext\n \xe2\x94\x9c\xe2\x94\x80 com.example.MyApplication instance\n \xe2\x94\x82 Leaking: NO (Application is a singleton)\n \xe2\x94\x82 mBoundService instance of com.example.services.SessionService\n \xe2\x94\x82 mBase instance of …Run Code Online (Sandbox Code Playgroud) android memory-leaks memory-profiling android-activity java-memory-leaks
我正在编写一个我无法在Eclipse中测试的servlet,我需要在服务器上运行.我想做内存分析并找出任何泄漏.所以,我想我需要编写调试语句来告诉我当前的内存使用情况.有人能指出我如何做到这一点的好参考和/或JDK中的哪些类做到这一点?
请注意,我不能使用"Eclipse MAT".
根据我到目前为止所读的内容,实际/驻留字节表示分配给应用程序的字节数,包括该应用程序不再使用但尚未被OS回收的字节。活动/脏字节是应用程序实际使用且操作系统无法回收的字节。我认为XCode Debug导航器中显示的数字是“实时字节”。
我有兴趣通过编程方式获取此数字(用于我们自己的统计信息/分析),但是我发现的代码只能提供常驻字节的值,该值大于Xcode在某些设备上显示的值(几乎是两倍) ),实际上是在相同设备上,但iOS版本不同。(在iOS 9上,它的值几乎是它的两倍,但在iOS 11上,它的值几乎与Xcode相同)。
我正在使用的代码是这样的:
struct mach_task_basic_info info;
mach_msg_type_number_t size = MACH_TASK_BASIC_INFO_COUNT;
kern_return_t kerr = task_info(mach_task_self(),
MACH_TASK_BASIC_INFO,
(task_info_t)&info,
&size);
if( kerr == KERN_SUCCESS ) {
NSLog(@"Memory in use (in bytes): %u", info.resident_size);
return info.resident_size;
} else {
NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
Run Code Online (Sandbox Code Playgroud)
是否有一些代码来获取实时字节值(如Xcode所示)?
当尝试对特定方法进行基准测试时,关于创建了多少对象以及在该方法运行时它们占用了多少字节,在 Android 中可以这样做:
Debug.resetThreadAllocCount()
Debug.resetThreadAllocSize()
Debug.startAllocCounting()
benchmarkMethod()
Debug.stopAllocCounting()
var memoryAllocCount = Debug.getThreadAllocCount()
var memoryAllocSize = Debug.getThreadAllocSize()
Run Code Online (Sandbox Code Playgroud)
我现在想对相同的方法进行基准测试,但在这些方法不可用的普通桌面应用程序上。我没有发现任何类似的东西,我尝试过的任何其他内存基准测试代码都没有提供一致的结果,就像上面的代码一样,每次运行相同的基准测试时都会给出完全相同的结果。
任何建议,最好只是代码将不胜感激,但是如果它能够执行我正在尝试做的任务,我也愿意尝试一些软件。