[lucene] 关于lucene内存溢出的问题
csy2266670
2011-01-18
现在我正在做一个站内搜索引擎,但是整个系统的前台后台是分开的,就是说由2个子项目构成
前台就是查询,后台就是对索引的构建、重构和更新 但是现在就出问题了 启动tomcat后,如果我先在后台重构索引,然后在前台进行搜索,就会报java.lang.OutOfMemoryError: Java heap space这个错误,或者我先查询,然后在重构索引,也同样报这个错误。 但是,如果我先在后台重构索引后,又重启服务器,再在前台进行搜索,就不会报错了。 而且,如果我在前台进行索引的重构,然后搜索,是不会出这样的问题的,我怀疑就是因为系统分为了2块,但是中间是什么问题我就不知道了,不知道有没有人曾遇见过这样的问题,或者有解决的思路,可以给我分析下,谢谢了 |
|
luckaway
2011-01-19
JVM的堆内存是否调整过,1G~2G之间都可以的!
|
|
kernaling.wong
2011-01-19
首先的话,要说明一点,这样不一定是Lucene的内存溢出的问题,就按现在来看,感觉是tomcat 与 搜索 聚合在一起,很难查到具体是什么原因导致内存溢出。
建议:tomcat 与 搜索部分完全分开两个独立的部分,页面程序可以通过socket来传输,这样可以分开两个系统,而且,保证不会出现楼主所说的问题 第二,要看整体数据量有多少,同时要看看实际lucene占用内存是多少了。 |
|
csy2266670
2011-01-19
luckaway 写道 JVM的堆内存是否调整过,1G~2G之间都可以的!
堆内存暂时没调整,不过测试数据量都不大,应该是不是这个问题 |
|
csy2266670
2011-01-19
kernaling.wong 写道 首先的话,要说明一点,这样不一定是Lucene的内存溢出的问题,就按现在来看,感觉是tomcat 与 搜索 聚合在一起,很难查到具体是什么原因导致内存溢出。
建议:tomcat 与 搜索部分完全分开两个独立的部分,页面程序可以通过socket来传输,这样可以分开两个系统,而且,保证不会出现楼主所说的问题 第二,要看整体数据量有多少,同时要看看实际lucene占用内存是多少了。 请问下,你说的第1种方法 为什么要用socket来传输呢,这样做如何分开2个系统,我还没用过socket,可以给我说说么 我现在在想是否是因为一个子系统建立索引后也占用某个资源,导致另一个子系统查询索引就造成内存溢出,但是被占用的是什么我还没想到 或者是创建索引后什么东西还占用着内存空间,导致查询索引时内存不够 |
|
csy2266670
2011-01-19
luckaway 写道 JVM的堆内存是否调整过,1G~2G之间都可以的!
刚刚重新调整了下JVM的内存大小,现在不会报内存溢出的问题了 谢谢luckaway和kernaling 但是还是有这个问题 在不修改JVM内存大小的前提下 1、前台进行索引的创建和搜索是不会造成内存溢出的 2、后台创建索引,前台搜索就会内存溢出 我想问为什么这个2种情况不有不同的结果 都是进行相同的操作 难道说前台系统中索引的创建和搜索占用的内存和单独进行索引的创建、搜索的内存一样大,而后台系统创建索引前台搜索占用的内存相当于2倍于以上的操作? |
|
luckaway
2011-01-19
前台和后台是两个项目,加载到内存的索引数据肯定是双倍的!
搜索引擎应用都是要调整堆内存的! 词典、倒排表、排序表都比较占内存的 |
|
illu
2011-01-19
2、后台创建索引,前台搜索就会内存溢出
搜索一下能费几个内存 是不是你程序有问题? |
|
wu_quanyin
2011-01-19
检查搜索时,indexSearcher indexReader有没有都关闭掉,,,,特别是indexReader....
其他肯定是程序哪里出了问题,,要不然不会在启动时异常... |
|
csy2266670
2011-01-19
不好意思,刚接触lucene,很多不懂的地方
之前wu_quanyin给我了个更新索引后 indexSearcher、indexReader的reopen的例子,我用上了 然后我想到我建立indexSearcher对象是单例的,除了更新后重新打开indexSearcher、indexReader,我在想就一个对象不用关闭吧,而且我也不知道在什么情况下再关闭它们 之前luckaway也说过建立indexSearcher缓存,我找了很久,也没有一个比较明确的说法,所以我不太清楚怎么去建立。 总之,可以说我压根就没关闭过indexSearcher和indexReader(戴好头盔,准备接砖头) 你们可以再给我解释下么,谢了 还有个问题就是多少数据量占用多少内存,有一个大概的说明么,主要是没有接触过,没概念 |
相关讨论
相关资源推荐
- JDK的OutputStream为什么方法write(int b)的入参类型是int呢?
- 关于OutputStream的write方法FAQ(from bbs.csdn.net)
- 再探Linux内核write系统调用操作的原子性
- 纠正:Android Attempt to write to field ‘int android.support.v7.widget.RecyclerView$ViewHolder...
- 请使劲回答一个关于UNIX/Linux自动扩展stack的问题
- AIGC:ChatGPT(一个里程碑式的对话聊天机器人)的简介(意义/功能/核心技术等)、使用方法(七类任务)、案例应用(提问基础性/事实性/逻辑性/创造性/开放性的问题以及编程相关)之详细攻略
- Java面试官最爱问的volatile关键字
- 锁机制:读者写者问题 Linux C
- 在线编程——动态规划常见的面试问题总结(Python)
- 全面解析《嵌入式程序员应该知道的16个问题》