成千上万的字符串,大多数只用一次,如何回收?

walkuere 2016-11-28 12:43:51
很多东西为了图方便,就用字符串,但是我听说java会为每一个字符串创建一个值,这样字符串池里的对象会非常非常多

但是绝大多数字符串我只用一次,请问如何让java把大量在某个函数中使用字符串从池中清理掉?


我有一个函数是大量注入字符串到一个列表,然后运行到这里的时候打印出来,然后到了下一屏就不再用这些字符串了。
还有一些指令是字符串拼接成的。
...全文
1373 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
walkuere 2017-10-31
  • 打赏
  • 举报
回复
对了我把项目的演示给你们看下,你们就知道大概是什么样子了 www.bilibili.com/video/av6510189 在程序里,我是先把 i("故事句子1"); i("故事句子2"); 放到一个列表里,然后程序执行到列表这里的时候,把列表里的内容打印到平台上,当切换到下一幕的时候,这个字符串就算永久不需要了 这个列表整个就不需要了 这时候,怎么告诉GC可以回收了? new个新的,旧的不用?整个removeall就可以了吗?还是要=null? 这样一般都会从字符串池中解脱出来吗?否则字符串池太多了 是整个介绍春秋500多年的
baij1230 2016-12-17
  • 打赏
  • 举报
回复
最好使用stringbuffer或者stringbuilder,配合setLength(0)
walkuere 2016-12-17
  • 打赏
  • 举报
回复
引用 16 楼 chnliujd 的回复:
这些日志应该存在数据库里的吧,并且存储也是以Id的形式,不是以字符串存储的,只有在展示给玩家客户端时才临时组成字符串 临时组成的字符串,被GC回收就可以了啊
这个是正解吧。。。 类似的可以写个文件,用行数表示ID,代码里引用行数ID是不是可行?[/quote] 怕麻烦,多写几个GC我还能接受
  • 打赏
  • 举报
回复
切到下一屏时手动调用gc
chnliujd 2016-12-10
  • 打赏
  • 举报
回复
引用 12 楼 hemowolf 的回复:
[quote=引用 11 楼 walkuere 的回复:] [quote=引用 7 楼 hemowolf 的回复:] 那又怎么样,那些字符串能多到哪里去?不可能多过一部10W字的小说吧,一部10W字的小说存成文本文件,用GBK编码,也不过是1M左右。 10W字是什么概念,刚才网上找了一下,一部水浒传大约100W字不到,一部《天龙八部》大约是180W字不到,全部放到内存里不过十几M空间,你真要做一个RPG游戏的服务器,不会这么点内存都没有吧(当然客户端应该不会一次性加载所有对话内容)。
可是不光这些,还有操作log 比如 势力某某 执行了某条指令 招募了某某武将,在某地进行开发 比如 某个历史事件,让某个历史人物跳槽,让某个历史人物死亡,某势力发生政变 [/quote] 这些日志应该存在数据库里的吧,并且存储也是以Id的形式,不是以字符串存储的,只有在展示给玩家客户端时才临时组成字符串 临时组成的字符串,被GC回收就可以了啊[/quote] 这个是正解吧。。。 类似的可以写个文件,用行数表示ID,代码里引用行数ID是不是可行?
乔不思 2016-12-09
  • 打赏
  • 举报
回复
jvm的参数调好就行,何必在意这么多,在意这么多建议不要用java了,java通过jvm自动gc,也不建议手动gc。
walkuere 2016-12-06
  • 打赏
  • 举报
回复
引用 7 楼 hemowolf 的回复:
那又怎么样,那些字符串能多到哪里去?不可能多过一部10W字的小说吧,一部10W字的小说存成文本文件,用GBK编码,也不过是1M左右。 10W字是什么概念,刚才网上找了一下,一部水浒传大约100W字不到,一部《天龙八部》大约是180W字不到,全部放到内存里不过十几M空间,你真要做一个RPG游戏的服务器,不会这么点内存都没有吧(当然客户端应该不会一次性加载所有对话内容)。
可是不光这些,还有操作log 比如 势力某某 执行了某条指令 招募了某某武将,在某地进行开发 比如 某个历史事件,让某个历史人物跳槽,让某个历史人物死亡,某势力发生政变
晴天_ccc 2016-12-06
  • 打赏
  • 举报
回复
确保String在使用后不要存在引用就行,gc会回收。
Anyw 2016-12-06
  • 打赏
  • 举报
回复
在使用string对象完成之后,已经要将string复制为null,这样gc就会回收你的字符串了
小灰狼 2016-12-06
  • 打赏
  • 举报
回复
引用 11 楼 walkuere 的回复:
[quote=引用 7 楼 hemowolf 的回复:] 那又怎么样,那些字符串能多到哪里去?不可能多过一部10W字的小说吧,一部10W字的小说存成文本文件,用GBK编码,也不过是1M左右。 10W字是什么概念,刚才网上找了一下,一部水浒传大约100W字不到,一部《天龙八部》大约是180W字不到,全部放到内存里不过十几M空间,你真要做一个RPG游戏的服务器,不会这么点内存都没有吧(当然客户端应该不会一次性加载所有对话内容)。
可是不光这些,还有操作log 比如 势力某某 执行了某条指令 招募了某某武将,在某地进行开发 比如 某个历史事件,让某个历史人物跳槽,让某个历史人物死亡,某势力发生政变 [/quote] 这些日志应该存在数据库里的吧,并且存储也是以Id的形式,不是以字符串存储的,只有在展示给玩家客户端时才临时组成字符串 临时组成的字符串,被GC回收就可以了啊
月明星稀灬 2016-12-05
  • 打赏
  • 举报
回复
尽量使用StringBuffer吧 GC的话,等你对String对象的引用没有了,会不定期的帮你清除这些对象。不过万一GC没开始的这段时间,程序出现很多String对象,就会灰常卡。 String用完了之后给他赋值null,感觉稍微能缓解一下。
秃头桔 2016-12-05
  • 打赏
  • 举报
回复
 JavaJVM 应该会处理吧
bcsflilong 2016-12-05
  • 打赏
  • 举报
回复
GC 帮你处理
小灰狼 2016-12-05
  • 打赏
  • 举报
回复
引用 6 楼 walkuere 的回复:
[quote=引用 5 楼 hemowolf 的回复:] 不是编译期间就可以确定内容的字符串,是不会放到常量池里的 所以,这些运行时才生成的中间字符串,只会当作垃圾进行回收 想提高性能,主要从减少这些字符串的方向入手
哎,可是你们知道,一个RPG有大量写死的剧情对话。。。[/quote] 那又怎么样,那些字符串能多到哪里去?不可能多过一部10W字的小说吧,一部10W字的小说存成文本文件,用GBK编码,也不过是1M左右。 10W字是什么概念,刚才网上找了一下,一部水浒传大约100W字不到,一部《天龙八部》大约是180W字不到,全部放到内存里不过十几M空间,你真要做一个RPG游戏的服务器,不会这么点内存都没有吧(当然客户端应该不会一次性加载所有对话内容)。
walkuere 2016-12-04
  • 打赏
  • 举报
回复
引用 5 楼 hemowolf 的回复:
不是编译期间就可以确定内容的字符串,是不会放到常量池里的 所以,这些运行时才生成的中间字符串,只会当作垃圾进行回收 想提高性能,主要从减少这些字符串的方向入手
哎,可是你们知道,一个RPG有大量写死的剧情对话。。。
小灰狼 2016-12-01
  • 打赏
  • 举报
回复
不是编译期间就可以确定内容的字符串,是不会放到常量池里的 所以,这些运行时才生成的中间字符串,只会当作垃圾进行回收 想提高性能,主要从减少这些字符串的方向入手
爱睡觉的阿狸 2016-12-01
  • 打赏
  • 举报
回复
你尽量避免创建多余的字符串
0萌萌哒0 2016-11-30
  • 打赏
  • 举报
回复
话说动态创建的字符串不会默认跑到常量池里面的,不用担心GC扫不掉它们。。
walkuere 2016-11-28
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/10952443/string-constant-pool-memory-sector-and-garbage-collection http://java-performance.info/string-intern-in-java-6-7-8/
Inhibitory 2016-11-28
  • 打赏
  • 举报
回复
不能释放,字符串都编译到二进制程序的数据段了

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧