Questions tagged «memory-management»

动态分配和释放部分物理内存的过程,以响应程序请求(如果可能),请求者之间保持公平且无饥饿。


20
使用GC.Collect()有什么问题?
尽管我确实理解使用此功能的严重意义(或者至少是我的想法),但我无法理解为什么它成为受尊敬的程序员永远不会使用的东西之一,即使那些甚至不知道的人是为了什么 假设我正在开发一个应用程序,该应用程序的内存使用量会根据用户的操作而变化很大。应用程序的生命周期可以分为两个主要阶段:编辑和实时处理。在编辑阶段,假设创建了数十亿甚至数万亿个对象。其中有些很小,有些则没有,有些可能没有终结器,而有些寿命可能从几毫秒到很长时间不等。接下来,用户决定切换到实时阶段。在这一点上,假设性能起着根本性的作用,并且程序流程中的任何细微改动都可能带来灾难性的后果。然后,通过使用对象池等将对象创建减少到最小程度,但是GC意外插入并扔掉所有对象,然后有人死亡。 问题:在这种情况下,进入第二阶段之前调用GC.Collect()是否明智? 毕竟,这两个阶段永远不会在时间上相互重叠,并且GC可以收集的所有优化和统计信息在这里几乎没有用处... 注意:正如您中某些人指出的那样,.NET可能不是适用于此类应用程序的最佳平台,但这超出了此问题的范围。目的是弄清楚GC.Collect()调用是否可以改善应用程序的整体行为/性能。我们都同意,在这种情况下您会做这种事情的情况极为罕见,但是GC再次尝试猜测并在大多数情况下都做得很好,但这仍然只是猜测。 谢谢。

4
虚拟内存和物理内存之间有什么区别?
我经常对操作系统中的虚拟化概念感到困惑。考虑到RAM是物理内存,为什么我们需要虚拟内存来执行进程? 当来自外部硬盘驱动器的进程(程序)被带到主存储器(物理存储器)执行时,该虚拟存储器位于何处。 谁负责虚拟内存,虚拟内存的大小是多少? 假设RAM的大小为4GB(即2 ^ 32-1地址空间),虚拟内存的大小是多少?

4
竞技场一词与记忆有关的含义是什么?
我正在读一本关于内存的编程概念书。在后面的章节中,作者大量使用了arena一词,但从未定义。我搜索了单词的含义以及它与记忆的关系,但没有发现任何问题。以下是作者使用该术语的几种情况: “序列化的下一个示例包含了一种从特定场所进行的称为内存分配的策略。” “ ...在处理内存泄漏或从特定场所进行分配时,这很有用。” “ ...如果我们想重新分配内存,那么我们将重新分配整个竞技场。” 作者在一章中使用了100次以上的术语。词汇表中的唯一定义是: 从竞技场分配 -先分配竞技场,然后由程序本身(而不是由进程内存管理器)管理竞技场内的分配/取消分配的技术;用于复杂数据结构和对象的压缩和序列化,或用于安全关键和/或容错系统中的内存管理。 在这些情况下,谁能为我定义竞技场?

10
jQuery或javascript查找页面的内存使用情况
有没有办法找出网页或我的jquery应用程序正在使用多少内存? 这是我的情况: 我正在使用一个jQuery前端和一个提供JSON数据的restful后端来构建一个数据繁重的webapp。页面被加载一次,然后一切都通过ajax发生。 用户界面为用户提供了一种在用户界面内创建多个选项卡的方式,每个选项卡可以包含大量数据。我正在考虑限制它们可以创建的选项卡的数量,但我认为仅在内存使用量超过特定阈值时才限制它们是很好的。 根据答案,我想作一些澄清: 我正在寻找一种运行时解决方案(而不仅仅是开发人员工具),以便我的应用程序可以根据用户浏览器中的内存使用情况来确定操作。 计算DOM元素或文档大小可能是一个不错的估计,但由于它不包括事件绑定,data(),插件和其他内存中的数据结构,因此可能非常不准确。

7
大对象堆碎片
我正在使用的C#/。NET应用程序正遭受缓慢的内存泄漏。我已经将CDB与SOS结合使用,试图确定正在发生的事情,但是数据似乎没有任何意义,因此我希望你们中的一个以前可能已经经历过这种情况。 该应用程序在64位框架上运行。它正在不断地计算数据并将其序列化到远程主机,并且相当大地达到了大对象堆(LOH)。但是,我希望大多数LOH对象都是瞬态的:一旦完成计算并将其发送到远程主机,就应该释放内存。但是,我看到的是大量(活动的)对象数组与空闲的内存块交错,例如,从LOH中获取随机段: 0:000> !DumpHeap 000000005b5b1000 000000006351da10 Address MT Size ... 000000005d4f92e0 0000064280c7c970 16147872 000000005e45f880 00000000001661d0 1901752 Free 000000005e62fd38 00000642788d8ba8 1056 <-- 000000005e630158 00000000001661d0 5988848 Free 000000005ebe6348 00000642788d8ba8 1056 000000005ebe6768 00000000001661d0 6481336 Free 000000005f214d20 00000642788d8ba8 1056 000000005f215140 00000000001661d0 7346016 Free 000000005f9168a0 00000642788d8ba8 1056 000000005f916cc0 00000000001661d0 7611648 Free 00000000600591c0 00000642788d8ba8 1056 00000000600595e0 …

7
如何为Eclipse提供比512M更多的内存?
我有以下设置,但是当我将1024替换为512并全部替换为1024时,eclipse根本不会启动。我的Eclipse JVM如何拥有超过512M的内存? -startup plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519 -product com.springsource.sts.ide --launcher.XXMaxPermSize 512M -vm C:\Program Files (x86)\Java\jdk1.6.0_18\bin\javaw -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms512m -Xmx512m -XX:MaxPermSize=512m


7
NSAutoreleasePool自动释放池如何工作?
据我了解,使用alloc,new或copy创建的任何内容都需要手动释放。例如: int main(void) { NSString *string; string = [[NSString alloc] init]; /* use the string */ [string release]; } 我的问题是,这样难道不是同样有效吗?: int main(void) { NSAutoreleasePool *pool; pool = [[NSAutoreleasePool alloc] init]; NSString *string; string = [[[NSString alloc] init] autorelease]; /* use the string */ [pool drain]; }

2
在Swift程序中是否需要使用autoreleasepool?
在WWDC14演示文稿的第17页上,它说 使用Objective-C?仍然必须管理自动释放池 autoreleasepool {/ *代码* /} 那是什么意思?这是否意味着如果我的代码库中没有任何Objective-C文件,那autoreleasepool {}是不必要的吗? 在回答一个相关问题时,有一个示例在其中autoreleasepool有用: - (void)useALoadOfNumbers { for (int j = 0; j < 10000; ++j) { @autoreleasepool { for (int i = 0; i < 10000; ++i) { NSNumber *number = [NSNumber numberWithInt:(i+j)]; NSLog(@"number = %p", number); } } } } 如果上面的代码通过autoreleasepool拖放转换为Swift ,Swift是否足够聪明,知道number应该在第一个变量之后释放变量}(就像其他语言一样)?

3
什么是“记忆重击”?
我刚发现这篇博客文章提到“踩踏内存”: 一个很容易踩内存的C ++程序(如果您出生在托管代码世界中,您可能甚至从未听说过。) 实际上,我从未听说过! 那么,这是什么呢?什么时候发生?

10
如何在C ++类的内存结构中创建一个“空格”?
问题 在低级别的裸机嵌入式环境中,我想在内存中以C ++结构创建一个空白且没有任何名称的名称,以禁止用户访问此类内存位置。 现在,我通过放置一个丑陋的uint32_t :96;位域(可以方便地代替三个词)来实现它,但是它会引起GCC的警告(位域太大,无法容纳在uint32_t中),这是非常合理的。 虽然可以正常工作,但是当您要分发包含数百种警告的库时,它并不是很干净。 我该怎么做呢? 为什么首先存在问题? 我正在从事的项目包括定义整个微控制器系列(STMicroelectronics STM32)的不同外设的存储器结构。为此,结果是一个类,其中包含多个结构的联合,这些结构定义了所有寄存器,具体取决于目标微控制器。 下面是一个非常简单的外设的简单示例:通用输入/输出(GPIO) union { struct { GPIO_MAP0_MODER; GPIO_MAP0_OTYPER; GPIO_MAP0_OSPEEDR; GPIO_MAP0_PUPDR; GPIO_MAP0_IDR; GPIO_MAP0_ODR; GPIO_MAP0_BSRR; GPIO_MAP0_LCKR; GPIO_MAP0_AFR; GPIO_MAP0_BRR; GPIO_MAP0_ASCR; }; struct { GPIO_MAP1_CRL; GPIO_MAP1_CRH; GPIO_MAP1_IDR; GPIO_MAP1_ODR; GPIO_MAP1_BSRR; GPIO_MAP1_BRR; GPIO_MAP1_LCKR; uint32_t :32; GPIO_MAP1_AFRL; GPIO_MAP1_AFRH; uint32_t :64; }; struct { uint32_t :192; GPIO_MAP2_BSRRL; GPIO_MAP2_BSRRH; uint32_t …

6
什么时候应该在C中使用malloc,什么时候不应该?
我了解malloc()的工作方式。我的问题是,我将看到以下内容: #define A_MEGABYTE (1024 * 1024) char *some_memory; size_t size_to_allocate = A_MEGABYTE; some_memory = (char *)malloc(size_to_allocate); sprintf(some_memory, "Hello World"); printf("%s\n", some_memory); free(some_memory); 为了简洁起见,我省略了错误检查。我的问题是,您不能通过初始化指向内存中某些静态存储的指针来完成上述操作吗?也许: char *some_memory = "Hello World"; 在什么时候您实际上需要自己分配内存,而不是声明/初始化需要保留的值?


14
当仍有大量可用内存时,抛出“ System.OutOfMemoryException”
这是我的代码: int size = 100000000; double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb double[] randomNumbers = new double[size]; 异常:引发了类型为'System.OutOfMemoryException'的异常。 我在这台机器上有4GB内存,开始运行时有2.5GB可用空间,PC上显然有足够的空间来处理762mb的100000000随机数。给定可用内存,我需要存储尽可能多的随机数。当我开始生产时,包装盒上将有12GB,我想利用它。 CLR是否将我限制为默认的最大内存开始?以及我如何要求更多? 更新资料 我认为如果问题是由于内存碎片造成的话,将它分成较小的块并逐步增加我的内存需求将会有所帮助,但是不管我做什么调整blockSize,我都无法超过256mb的总ArrayList大小。 private static IRandomGenerator rnd = new MersenneTwister(); private static IDistribution dist = new DiscreteNormalDistribution(1048576); private static List<double> ndRandomNumbers = new List<double>(); private static …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.