我正在为 Lucene 编写一个包装器。当频繁发出搜索请求时,可能会抛出“无法为对象堆保留足够的空间”的错误。如何获取对象堆的大小?我该如何解决这个问题?
最佳答案
我相信根本问题与SO问题Could not reserve enough space for object heap的好答案中描述的相同。 .
也就是说,JVM 试图向操作系统请求堆内存,但操作系统拒绝了,因为它已经将所有虚拟内存分配给其他进程。
我预计当您频繁启动索引器时会发生这种情况,因为:
- 它增加了系统平均负载(正在运行/等待运行的进程数),因此
- 它增加了系统的平均提交虚拟内存资源,因此
- 当新的 JVM 开始运行索引器时,操作系统更有可能不得不说“不”。
当然,这很大程度上只是猜测......
<小时/>对此你能做什么?
- 增加用于分页的磁盘文件或分区的大小。
- 为计算机添加更多物理内存。
- 减少运行索引器的频率和/或在系统不繁忙时运行索引器。
- 调整索引器堆的大小。
- 将部分其他负载转移到另一台机器上。
其中一些需要小心执行,因为它们可能会以各种方式影响整体系统性能。
(顺便说一句,我认为切换到 64 位操作系统不一定有帮助,而运行 64 位 JVM 肯定不会有帮助...)
关于java - 无法为对象堆保留足够的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5550638/