我刚刚接受了一次采访,并被要求用Java创build内存泄漏。 毋庸置疑,我觉得自己很笨,不知道如何开始创build一个。 什么是一个例子?
我如何确定我的数组在C中的大小? 也就是说,数组可以容纳的元素的数量?
我感兴趣的是在哪里string文字分配/存储。 我在这里find了一个有趣的答案,他说: 定义一个内联string实际上是embedded在程序本身的数据,不能改变(一些编译器允许这个聪明的把戏,不要打扰)。 但是,这与C ++有关,更不用说它不说了。 我很烦。 = d 所以我的问题是我的string文字保存在哪里以及如何? 为什么我不应该试图改变它? 实施是否因平台而异? 有没有人关心“巧妙的把戏”?
我知道操作系统有时会用某些模式(如0xCD和0xDD)初始化内存。 我想知道的是什么时候以及为什么发生这种情况。 什么时候 这是特定于编译器使用? 做malloc /新的和释放/删除相同的方式在这方面的工作? 它是特定于平台吗? 它会发生在其他操作系统,如Linux或VxWorks? 为什么 我的理解是,这只发生在Win32debuggingconfiguration中,它用于检测内存溢出并帮助编译器捕获exception。 你能举出一些实际的例子来说明这个初始化是有用的吗? 我记得读过一些东西(也许在Code Complete 2中),分配内存到一个已知的模式是很好的,某些模式会在Win32中触发中断,这将导致在debugging器中显示exception。 这是多么便携?
我怎样才能find我的Android应用程序使用的内存,编程? 我希望有办法做到这一点。 另外,如何获得手机的免费内存?
列出你最喜欢的堆分析工具(例如jprofiler,jmap,…)。 让我们每个答案保持一个工具,每个工具的优点和缺点的简短列表。
例如,假设我有一个应用程序可以读取一堆数据行的CSV文件。 我根据数据types向用户提供行数摘要,但是我想确保不读取太多数据行并导致OutOfMemoryError 。 每一行都翻译成一个对象。 有没有一种简单的方法来以编程方式找出该对象的大小? 是否有一个引用来定义一个VM有多大的基本types和对象引用? 现在,我的代码说可以读取32,000行 ,但是我也希望代码能够读取尽可能多的行,直到我使用了32MB的内存。 也许这是一个不同的问题,但我仍然想知道。
如何找到Java中的内存泄漏(例如,使用JHat)? 我已经尝试在JHat中加载堆转储以获得基本的外观。 但是,我不明白我应该如何能够找到根引用( ref )或任何它被称为。 基本上,我可以告诉有几百兆哈希表条目([java.util.HashMap $条目或类似的东西),但地图遍布的地方…有没有办法搜索大地图,或者找到大对象树的一般根源? [编辑]好吧,我已经阅读了答案,但我们只是说我是一个便宜的混蛋(这意味着我更感兴趣学习如何使用JHat比支付JProfiler)。 此外,JHat始终可用,因为它是JDK的一部分。 除非JHat没有办法,否则蛮力,但我不敢相信可以这样。 此外,我不认为我将能够实际修改(添加所有地图大小的日志记录)并运行足够长的时间,以便我注意到泄漏。
我一直能够为运行在32位Windows XP(Java 1.4,1.5和1.6)上的Java SE分配1400兆字节。 java -Xmx1400m … 今天我在一台使用Java 1.5_16和1.6.0_07的新Windows XP机器上尝试了相同的选项,并得到了错误: Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine. 通过试验和错误似乎1200兆是我可以分配在这台机器上最多。 任何想法为什么一台机器会允许1400和另一个只有1200? 编辑:该机有4GB的RAM,约3.5GB,Windows可以识别。
在C中,我知道我可以使用下面的代码在堆上动态分配一个二维数组: int** someNumbers = malloc(arrayRows*sizeof(int*)); for (i = 0; i < arrayRows; i++) { someNumbers[i] = malloc(arrayColumns*sizeof(int)); } 显然,这实际上创建了一个指向一堆单独的一维整数数组的指针的一维数组,“系统”可以找出我的意思,当我要求: someNumbers[4][2]; 但是当我静态声明一个二维数组,如下面的行…: int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS]; …是否在堆栈上创建了类似的结构,还是完全是另一种形式? (也就是说,它是一个指针的一维数组吗?如果不是,它是什么,以及如何得到它的引用?) 另外,当我说“系统”时,究竟是什么负责确定呢? 内核? 或者C编译器在编译时将其整理出来?