`
sanyecao2314
  • 浏览: 135157 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

对生产环境内存溢出的分析1

JVM 
阅读更多
昨天下午,生产环境168服务器突然报内存溢出.临时抓了jvm快照.重启解决.
今天分析jvm快照.一眼就发现有对象貌似存在异常.DictSegment对象在JVM中有60W+个实例化的对象.
 
    凭经验,一般的JVM溢出都是有对象没有处理好.GC没有回收,导致在JVM里越来越多导致.所以首先排查调用这个类的方法.
    检查代码,发现只有一个类IndexCreateUtil使用到了DictSegment.方法本身的实现上没有问题.网上的demo方法都是这样使用的.
    实践出真知.自己写个测试类.
public class TestIndexCreateUtil2 {
@Test
public void testSplitBySegmenterStringBooleanBoolean() {
User user = new User();
testFenCi2();
try {
System.gc();
// 先不要停止,抓内存使用情况
Thread.sleep(1000000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
 
private void testFenCi2(){
String text = "让战士们过一个欢乐祥和的新春佳节。";
// 创建分词对象
StringReader reader = new StringReader(text);
Role role = new Role();
IKSegmenter ik = new IKSegmenter(reader, true);// 当为true时,分词器进行最大词长切分
Lexeme lexeme = null;
try {
while ((lexeme = ik.next()) != null) {
System.out.println(lexeme.getLexemeText());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
reader.close();
}
}
}
    在System.gc();行加断点.抓取JVM发现.执行到System.gc();时.特意加的role 对象还是存在的,但从Eclipse里没法查看了,这应该是还没有执行过GC导致的.另一个更重要的是.DictSegment类有60W+个实例化的对象.
    再次问度娘,调用方法都是对的,大概看了一下,感觉跟IKAnalyzer本身的分词算法可能有关.
    换一个思路.使用IKAnalyzer的作用就是加一些tag.没有使用其他比较高深的东西.那换一个分词软件行不行?
    找到度娘比较推荐的ansj测试.功能可以实现.也没有产生几十万个相同的类对象.再看内存使用.悲剧了.一句分词,内存直接从10M不到飙升到接近100M.而IKAnalyzer内存变动在10M以内的.
    
     综合考虑.还是不换IKAnalyzer了.在此标记一下.抓取到的JVM快照中如果有60W+个DictSegment对象.是正常的(但确实有点奇葩:).
    JVM溢出的原因待继续查找.
分享到:
评论

相关推荐

    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    假设在生产环境中,一个项目运行三周左右会出现内存溢出异常。JDK 使用的是 64 位版本,配置参数为 `-Xmx3078M -Xms3078M -XX:PermSize=1024M -XX:MaxPermSize=1024M`。通过 MAT 分析发现: - **Histogram** 显示 ...

    使用MAT分析Tomcat内存溢出

    在生产环境中,持续监控Tomcat的内存使用情况,设置合理的JVM内存参数,并定期进行内存分析,以便尽早发现和解决问题。 通过以上步骤,我们可以利用MAT有效地诊断和解决Tomcat的内存溢出问题。理解MAT的使用方法...

    Tomcat内存溢出的三种情况及解决办法分析

    在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。本文就介绍了Tomcat内存溢出的三种情况及解决办法分析

    java 内存溢出分析工具 CoreAnalyzer

    为了解决这一问题,Java提供了多种内存分析工具,其中CoreAnalyzer是一款专业的Java内存溢出分析工具。下面将详细介绍CoreAnalyzer的功能、使用方法以及如何通过它来分析和解决内存问题。 CoreAnalyzer主要功能: 1...

    eclipse tomcat启动,内存溢出问题

    #### 二、内存溢出原因分析 内存溢出通常是由以下几种情况导致的: 1. **应用程序内存消耗过高**:应用程序中存在大量占用内存的对象或数据结构,尤其是在长时间运行过程中未能有效释放不再使用的对象。 2. **默认...

    websphere内存溢出

    1. **内存溢出概述**:内存溢出(Out Of Memory,OOM)是Java应用中常见的问题,当应用程序请求的内存超过了JVM分配的内存空间时,就会出现这种情况。对于WebSphere来说,这可能表现为服务器崩溃、应用程序响应缓慢...

    myeclipse-tomcat jdk内存溢出

    ### MyEclipse-Tomcat JDK 内存...- 对于生产环境,建议使用更严格的监控机制来预防和处理内存溢出问题。 通过以上步骤,可以有效地解决MyEclipse中Tomcat服务器出现的JDK内存溢出问题,提高开发效率和系统的稳定性。

    tomcat_eclipse配置内存溢出

    #### 内存溢出原因分析 内存溢出主要是由于JVM在运行时分配给各个内存区域的大小不足所引起。对于`PermGen space`错误,主要原因是永久代(PermGen space)内存不足。永久代主要用于存储类的信息、常量、静态变量等...

    超实用内存溢出解决方法

    ### 超实用内存溢出解决方法 #### 内存溢出概述 内存溢出(Out Of Memory,简称OOM)是指程序在运行过程中申请的内存超过了系统能提供的最大内存限制,导致程序无法继续正常执行的现象。内存溢出分为堆内存溢出、非...

    tomcat内存溢出总结

    ### Tomcat内存溢出总结 ...通过以上分析,我们可以看出,在生产环境中配置Tomcat服务器时,合理设置JVM参数对于避免内存溢出至关重要。同时,了解和掌握内存溢出的基本原理和解决策略,有助于快速定位并解决问题。

    eclipse内存溢出处理

    在处理内存溢出时,这个参数并不是必须的,但如果需要进行详细的调试分析,可以使用它。 #### 4. `-XX:PermSize` 和 `-XX:MaxPermSize` 这两个参数用于设置永久代的初始大小和最大大小。在Java 8之前,类的信息、...

    关于内存溢出导致的服务器崩溃问题分享

    在生产环境中,服务器崩溃是非常常见的问题之一,而内存溢出是导致服务器崩溃的主要原因之一。本文将分享关于内存溢出导致的服务器崩溃问题,包括问题现象、问题排查、问题分析、问题原因、什么是内存溢出、内存溢出...

    java csv大数据量导出(千万级别,不会内存溢出)

    在实际生产环境中,为了确保稳定性,还需要考虑错误处理和重试机制。例如,当某个线程在处理数据时发生异常,应捕获异常并记录,同时不影响其他线程的执行。如果可能,还可以设计一个补偿机制,用于重新处理失败的...

    IBM内存分析工具(java)

    - 生成内存dump文件可能需要一段时间,对生产环境可能造成短暂影响,应选择合适的时机执行。 - 分析大型内存dump文件可能需要较高的硬件资源。 总结,IBM内存分析工具是Java开发者诊断和优化内存问题的得力助手,...

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    在Java应用服务器中,Tomcat是一个非常常见的轻量级选择,尤其在开发和部署Web应用程序时。然而,如同任何其他程序一样,...在实际操作中,记得备份当前的配置,并在测试环境中先进行调整,以避免对生产环境造成影响。

Global site tag (gtag.js) - Google Analytics