请教关于String,循环作用域及intern()相关问题

zhangsk_neusoft 2017-12-04 12:51:30
希望从JVM角度解释下面4部分代码不同效果的原因:
第一部分:

结果:不产生GC。

第二部分:

结果:产生GC。

第三部分:

结果:OOM异常。

第四部分:

结果产生GC,没有OOM异常。
...全文
93 4 点赞 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zhangsk_neusoft 2017-12-05
引用 2 楼 yuxiangaaaaa 的回复:
我的理解: 1就创建一个String,没有处理,2,循环中str是a,4循环中str是aa,死循环也能跑很久才能占满内存 3部分的str是a的长度一直成指数增加,a, aa ,aaaa ,aaaaaaaa, aaaaaaaaaaaaaaaaa......这样增加的太快,内存溢出了
感谢回答
  • 打赏
  • 举报
回复
zhangsk_neusoft 2017-12-05
引用 1 楼 pany1209 的回复:
大概意思是写在while循环外面,str可以做为GC roots,引用的new String("a")不会被垃圾回收,因为char[] copy = new char[newLength];数组copy过程中导致的堆溢出, 如果写在while循环里面不会作为GC Roots,会调用finalize()会被垃圾回收。。。。
感谢,还有第一部分 不是一直在产生对象吗 为什么不触发GC?
  • 打赏
  • 举报
回复
自由自在_Yu 2017-12-04
我的理解: 1就创建一个String,没有处理,2,循环中str是a,4循环中str是aa,死循环也能跑很久才能占满内存 3部分的str是a的长度一直成指数增加,a, aa ,aaaa ,aaaaaaaa, aaaaaaaaaaaaaaaaa......这样增加的太快,内存溢出了
  • 打赏
  • 举报
回复
李德胜1995 2017-12-04
大概意思是写在while循环外面,str可以做为GC roots,引用的new String("a")不会被垃圾回收,因为char[] copy = new char[newLength];数组copy过程中导致的堆溢出, 如果写在while循环里面不会作为GC Roots,会调用finalize()会被垃圾回收。。。。
  • 打赏
  • 举报
回复
相关推荐
发帖
Java
加入

4.8w+

社区成员

Java相关技术讨论
申请成为版主
帖子事件
创建了帖子
2017-12-04 12:51
社区公告
暂无公告