很多东西为了图方便,就用字符串,但是我听说java会为每一个字符串创建一个值,这样字符串池里的对象会非常非常多但是绝大多数字符串我只用一次,请问如何让java把大量在某个函数中使用字符串从池中清理掉?
我有一个函数是大量注入字符串到一个列表,然后运行到这里的时候打印出来,然后到了下一屏就不再用这些字符串了。
还有一些指令是字符串拼接成的。

解决方案 »

  1.   

    http://stackoverflow.com/questions/10952443/string-constant-pool-memory-sector-and-garbage-collection
    http://java-performance.info/string-intern-in-java-6-7-8/
      

  2.   


    哎,可是你们知道,一个RPG有大量写死的剧情对话
      

  3.   


    哎,可是你们知道,一个RPG有大量写死的剧情对话那又怎么样,那些字符串能多到哪里去?不可能多过一部10W字的小说吧,一部10W字的小说存成文本文件,用GBK编码,也不过是1M左右。
    10W字是什么概念,刚才网上找了一下,一部水浒传大约100W字不到,一部《天龙八部》大约是180W字不到,全部放到内存里不过十几M空间,你真要做一个RPG游戏的服务器,不会这么点内存都没有吧(当然客户端应该不会一次性加载所有对话内容)。
      

  4.   

    JavaJVM 应该会处理吧
      

  5.   

    尽量使用StringBuffer吧
    GC的话,等你对String对象的引用没有了,会不定期的帮你清除这些对象。不过万一GC没开始的这段时间,程序出现很多String对象,就会灰常卡。String用完了之后给他赋值null,感觉稍微能缓解一下。
      

  6.   


    可是不光这些,还有操作log
    比如 势力某某 执行了某条指令 招募了某某武将,在某地进行开发
    比如 某个历史事件,让某个历史人物跳槽,让某个历史人物死亡,某势力发生政变
      

  7.   


    可是不光这些,还有操作log
    比如 势力某某 执行了某条指令 招募了某某武将,在某地进行开发
    比如 某个历史事件,让某个历史人物跳槽,让某个历史人物死亡,某势力发生政变这些日志应该存在数据库里的吧,并且存储也是以Id的形式,不是以字符串存储的,只有在展示给玩家客户端时才临时组成字符串
    临时组成的字符串,被GC回收就可以了啊
      

  8.   

    在使用string对象完成之后,已经要将string复制为null,这样gc就会回收你的字符串了
      

  9.   

    确保String在使用后不要存在引用就行,gc会回收。
      

  10.   

    jvm的参数调好就行,何必在意这么多,在意这么多建议不要用java了,java通过jvm自动gc,也不建议手动gc。
      

  11.   


    可是不光这些,还有操作log
    比如 势力某某 执行了某条指令 招募了某某武将,在某地进行开发
    比如 某个历史事件,让某个历史人物跳槽,让某个历史人物死亡,某势力发生政变这些日志应该存在数据库里的吧,并且存储也是以Id的形式,不是以字符串存储的,只有在展示给玩家客户端时才临时组成字符串
    临时组成的字符串,被GC回收就可以了啊这个是正解吧
    类似的可以写个文件,用行数表示ID,代码里引用行数ID是不是可行?
      

  12.   


    这个是正解吧
    类似的可以写个文件,用行数表示ID,代码里引用行数ID是不是可行?怕麻烦,多写几个GC我还能接受
      

  13.   

    最好使用stringbuffer或者stringbuilder,配合setLength(0)
      

  14.   

    对了我把项目的演示给你们看下,你们就知道大概是什么样子了www.bilibili.com/video/av6510189在程序里,我是先把
    i("故事句子1");
    i("故事句子2");放到一个列表里,然后程序执行到列表这里的时候,把列表里的内容打印到平台上,当切换到下一幕的时候,这个字符串就算永久不需要了这个列表整个就不需要了这时候,怎么告诉GC可以回收了?
    new个新的,旧的不用?整个removeall就可以了吗?还是要=null?
    这样一般都会从字符串池中解脱出来吗?否则字符串池太多了
    是整个介绍春秋500多年的