java - 无法为对象堆保留足够的空间

标签 java lucene

我正在为 Lucene 编写一个包装器。当频繁发出搜索请求时,可能会抛出“无法为对象堆保留足够的空间”的错误。如何获取对象堆的大小​​?我该如何解决这个问题?

最佳答案

我相信根本问题与SO问题Could not reserve enough space for object heap的好答案中描述的相同。 .

也就是说,JVM 试图向操作系统请求堆内存,但操作系统拒绝了,因为它已经将所有虚拟内存分配给其他进程。

我预计当您频繁启动索引器时会发生这种情况,因为:

  • 它增加了系统平均负载(正在运行/等待运行的进程数),因此
  • 它增加了系统的平均提交虚拟内存资源,因此
  • 当新的 JVM 开始运行索引器时,操作系统更有可能不得不说“不”。

当然,这很大程度上只是猜测......

<小时/>

对此你能做什么?

  1. 增加用于分页的磁盘文件或分区的大小。
  2. 为计算机添加更多物理内存。
  3. 减少运行索引器的频率和/或在系统不繁忙时运行索引器。
  4. 调整索引器堆的大小。
  5. 将部分其他负载转移到另一台机器上。

其中一些需要小心执行,因为它们可能会以各种方式影响整体系统性能。

(顺便说一句,我认为切换到 64 位操作系统不一定有帮助,而运行 64 位 JVM 肯定不会有帮助...)

关于java - 无法为对象堆保留足够的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5550638/

相关文章:

Java多线程通信,生产者-消费者-取消,四个线程交互。任何干净稳健的方法都可以做到这一点

java - 防止Android服务被操作系统杀死

elasticsearch - 为什么我在es中获得了奇怪的规范值(value)?

java - Elasticsearch 如何使用聚合对多个文档字段中的值进行计数

java - 使用 Luke 的 Lucene 中出现 "<field> indexed without position data"错误的原因是什么?

java - 使用 Apache HttpClient 通过 SSL 身份验证发送 HTTP 请求

java - 多线程中的静态方法

java - Java 访问修饰符是否使用操作系统的权限,还是由 Java 本身控制访问权限?

linq - Sitecore ContentSearch LINQ 不支持的表达式节点类型 : Parameter

java - Lucene 3.0.2 特性