在运行时有没有什么好的办法让剩余内存可用于JVM? 这种情况的用例是当Web服务在接近内存限制时失败,拒绝新的连接,出现一个很好的错误消息“太多人使用它,稍后重试”,而不是突然死于OutOfMemory错误。 注意,这与事先计算/估计每个对象的成本无关。 原则上,我可以根据这个估计估计我的对象有多less内存,并拒绝新的连接,但是这似乎是一种哈克/脆弱。
我有一个例程每秒多次对SQLite数据库运行不同的查询。 过了一段时间,我会得到错误 "android.database.CursorWindowAllocationException: – Cursor window allocation of 2048 kb failed. # Open Cursors = "出现在LogCat中。 我有应用程序日志内存使用情况,实际上,当使用量达到一定的限制,我得到这个错误,意味着它用完了。 我的直觉告诉我,每次运行查询时,数据库引擎都会创build一个新的缓冲区(CursorWindow),即使我标记了.close()游标,垃圾收集器和SQLiteDatabase.releaseMemory()释放记忆。 我认为解决scheme可能在于“迫使”数据库始终写入相同的缓冲区,而不是创build新的数据库,但我一直无法find办法做到这一点。 我试图实例化我自己的CursorWindow,并试图设置它和SQLiteCursor无济于事。 有任何想法吗? 编辑:重新从@GrahamBorland示例代码请求: public static CursorWindow cursorWindow = new CursorWindow("cursorWindow"); public static SQLiteCursor sqlCursor; public static void getItemsVisibleArea(GeoPoint mapCenter, int latSpan, int lonSpan) { query = "SELECT * FROM Items"; //would be more complex in real […]
我正在研究一个正在破坏堆的multithreading C ++应用程序。 find这种腐败的常用工具似乎不适用。 源代码的旧版本(18个月)与最新发布的版本具有相同的行为,所以这已经存在了很长时间,并没有被注意到。 在缺点方面,不能使用源variables来确定何时引入错误 – 存储库中有很多代码更改。 崩溃行为的提示是在这个系统中生成吞吐量 – 数据的套接字传输被转化为内部表示。 我有一组testing数据,将定期导致应用程序exception(各种地方,各种原因 – 包括堆分配失败,因此:堆损坏)。 这种行为似乎与CPU功率或内存带宽有关; 每台机器越多,崩溃越容易。 禁用超线程核心或双核心核心会降低(但不会消除)腐败的速度。 这表明了与时间有关的问题。 现在这里是擦: 当它运行在一个轻量级的debugging环境(比如说Visual Studio 98 / AKA MSVC6 )时,堆损坏是相当容易重现的 – 十分钟或十五分钟之后,某些事情会发生可怕的exception,例如alloc; 当在一个复杂的debugging环境(Rational Purify, VS2008/MSVC9甚至Microsoft应用程序validation程序)下运行时,系统将变成内存速度限制,不会崩溃(内存限制:CPU没有达到50% ,磁盘指示灯不亮,程序运行的速度可以更快,消耗2G内存的1.3G内存)。 所以, 我可以在能够重现问题(但不能确定原因)或能够确定原因或无法重现的问题之间作出select。 我目前最好的猜测,接下来是: 获取一个疯狂的grunty框(以取代当前的dev盒:在E6550 Core2 Duo 2Gb内存); 这将使得有可能在强大的debugging环境下运行时导致崩溃导致错误行为; 要么 重写操作符new和delete以使用VirtualAlloc和VirtualProtect将内存尽快标记为只读。 运行在MSVC6下,让操作系统抓住正在释放内存的坏人。 是的,这是一个绝望的标志:谁将重写new和delete ? 我想知道这是否会像Purify等人一样慢。 并且,否:内置Purify仪器的运输不是一个选项。 一位同事刚刚走过去,问道:“堆栈溢出?我们现在正在堆栈溢出吗?!? 现在,问题是: 如何find堆腐败者? 更新:平衡new[]和delete[]似乎已经得到了解决这个问题很长的路要走。 应用程序现在大约两个小时才崩溃,而不是15分钟。 还没有。 还有什么build议? 堆腐败持续存在。 […]
由于我的问题越来越长,我决定重写整个问题,使其更好,更短。 我在8GB内存的专用服务器上运行我的网站。 我完全知道,我需要提高php.ini设置的内存限制。 我已经把它从128M设置为256M和-1。 问题仍然存在。 致命错误:内存不足(已分配786432)(试图分配24576字节)在D:\ www \ football \ views \ main.php在81行 内存不足没有意义,因为它表示只分配了786432个字节,并且需要更多的24576个字节。 786432字节只有768千字节,相当小。 提示 错误发生在一个非常随机的线上。 第81行不总是出错。 在高峰期,Apache只需要大约500MB的内存。 我还有6GB的空间。 没有无限循环。 该脚本需要1,042,424字节。 从echo memory_get_peak_usage();获取这个数字echo memory_get_peak_usage(); MySQL的结果集很小(最多12行,纯文本,没有斑点数据) ( 重要 )如果我每两天重新启动Apache一次,错误消失了。 当Apache运行超过2天时,通常会发生这种情况。 我已经包括了分析脚本,你可以在这里得到它。 这个专用服务器纯粹只用于运行一个网站。 这个网站是一个高stream量的网站,平均每分钟有1000个访问者。 在高峰时间,将有1700到2000名访问者同时访问。 服务器规格 操作系统:Windows 2008 R2 64位 CPU:Intel Core i5-4核心 内存:8 GB Apache 2.2 PHP 5.3.1 存储:2 x 1 TB硬盘 带宽:每月10 TB 解 […]
堆栈溢出如何发生,以及确保不发生的最好方法或防止堆栈溢出的方法,特别是在Web服务器上,但其他示例也会很有趣?
我做了一些研究。 一个字节是8位,一个字是可以在存储器上寻址的最小单位。 一个字的确切长度是变化的。 我不明白的是有一个字节是什么意思? 为什么不说8位? 我问了一个教授这个问题,他说现在大多数机器都是可以字节寻址的,但是这会产生什么呢?
我以为如果你的程序没有,那么GC会调用Dispose,但是你应该在你的程序中调用Dispose()来使清理变得确定。 但是,从我的小testing程序,我没有看到Dispose被调用…. public class Test : IDisposable { static void Main(string[] args) { Test s = new Test(); s = null; GC.Collect(); Console.ReadLine(); } public Test() { Console.WriteLine("Constructor"); } public void Dispose() { Console.WriteLine("Dispose"); } } //输出只是“构造函数”,我不会像我所期望的那样得到“Dispose”。 这是怎么回事? 编辑:是的,我知道我应该调用Dispose() – 我使用一次性对象时遵循标准模式。 我的问题出现了,因为我试图追踪一些代码中的泄漏,这是一个被pipe理的C ++(另一个复杂的层次,可能是另一个线程的主题)。
当我运行我的程序对valgrind,我遇到了以下警告。 Warning: set address range perms: large range [0x4d59d040, 0x6159d040) (undefined) Warning: set address range perms: large range [0x194f7030, 0x2d4f7050) (noaccess) Warning: set address range perms: large range [0x3959d030, 0x6159d050) (noaccess) 经过一番search之后,我发现这是一个Diagnostic message, mostly for benefit of the Valgrind developers, to do with memory permissions ,这些信息没有告诉我多less。 我的程序确实在堆上分配了大量的内存。 (一堆realloc后可以达到2-3 GB的RAM) 然而,尽pipe没有任何分配失败,警告仍然出现。 所以,我想知道这个消息是什么意思? 我没有某种内存许可? (但分配成功)
在看Go和Erlang的并发方法时,我注意到它们都依赖于消息传递。 这种方法显然减轻了对复杂锁的需求,因为没有共享状态。 但是,考虑许多客户机需要对内存中的单个大型数据结构进行并行只读访问的情况 – 如后缀数组。 我的问题: 将使用共享状态更快,并使用更less的内存比消息传递,因为数据是只读的,只需要在一个单一的位置存在锁通常是不必要的? 在消息传递上下文中如何处理这个问题? 会不会有一个访问数据结构的进程,客户端只需要按顺序请求数据呢? 或者,如果可能的话,数据是否会被分块来创build多个处理大块的进程? 鉴于现代CPU和内存的架构,这两种解决scheme之间是否有很大的区别?即,多核可以共享内存是否可以被并行读取?这意味着没有任何硬件瓶颈,否则这两个解决scheme会大致执行相同的操作?
有时,内存地址为0x0的数据非常有价值 – 以x86实模式IVT为例:它从0x0开始,包含指向中断处理程序的指针:0x00处的双字是指向除零error handling程序的指针。 但是,C11语言标准禁止解引用空指针[WG14 N1570 6.5.3.2],它们被定义为用0初始化的指针或用空指针初始化的指针[WG14 N1570 6.3.2.3],从而有效地禁止了第一个字节。 人们在需要时如何使用0x0?