string机制2

先来推荐一个检测内存泄漏的软件:JProfiler。很不错。本篇博文用到了这个软件。

接上一篇博文中那个经典面试问题。这里我用JProfiler对String对象的产生进行了监控。结果表明上篇博文的分析是正确的。

  1. public static void main(String[] args) {
  2.     System.out.println("=====Start========");
  3.     try {
  4.         Thread.sleep(500L*1000L);//停留5分钟,目的是为了方便JProfiler来监控内存。
  5.     } catch (InterruptedException e) {
  6.         e.printStackTrace();
  7.     }
  8.     System.out.println("=====End========");
  9. }
  10. /*
  11.  * 测试结果:String对象数目为:2406
  12.  * */
  1. public static void main(String[] args) {
  2.     System.out.println("=====Start========");
  3.     try {
  4.         String str1 = "abc";
  5.         Thread.sleep(500L*1000L);//停留5分钟,目的是为了方便JProfiler来监控内存。
  6.     } catch (InterruptedException e) {
  7.         e.printStackTrace();
  8.     }
  9.     System.out.println("=====End========");
  10. }
  11. /*
  12.  * 测试结果:String对象数目为:2407
  13.  * */
  1. public static void main(String[] args) {
  2.     System.out.println("=====Start========");
  3.     try {
  4.         String str2 = new String("abc");
  5.         Thread.sleep(500L*1000L);//停留5分钟,目的是为了方便JProfiler来监控内存。
  6.     } catch (InterruptedException e) {
  7.         e.printStackTrace();
  8.     }
  9.     System.out.println("=====End========");
  10. }
  11. /*
  12.  * 测试结果:String对象数目为:2408
  13.  * */
  1. public static void main(String[] args) {
  2.     System.out.println("=====Start========");
  3.     try {
  4.         String str1 = "abc";
  5.         String str2 = new String("abc");
  6.         Thread.sleep(500L*1000L);//停留5分钟,目的是为了方便JProfiler来监控内存。
  7.     } catch (InterruptedException e) {
  8.         e.printStackTrace();
  9.     }
  10.     System.out.println("=====End========");
  11. }
  12. /*
  13.  * 测试结果:String对象数目为:2408
  14.  * */
  1. public static void main(String[] args) {
  2.     System.out.println("=====Start========");
  3.     try {
  4.         String str1 = new String("abc");
  5.         String str2 = new String("abc");
  6.         Thread.sleep(500L*1000L);//停留5分钟,目的是为了方便JProfiler来监控内存。
  7.     } catch (InterruptedException e) {
  8.         e.printStackTrace();
  9.     }
  10.     System.out.println("=====End========");
  11. }
  12. /*
  13.  * 测试结果:String对象数目为:2409
  14.  * */
  1. public static void main(String[] args) {
  2.     System.out.println("=====Start========");
  3.     try {
  4.         String str1 = "abc";
  5.         String str2 = new String("def");
  6.         Thread.sleep(500L*1000L);//停留5分钟,目的是为了方便JProfiler来监控内存。
  7.     } catch (InterruptedException e) {
  8.         e.printStackTrace();
  9.     }
  10.     System.out.println("=====End========");
  11. }
  12. /*
  13.  * 测试结果:String对象数目为:2409
  14.  * */

好了,测试代码就这么多,分析结果很容易得出上篇博文的结论的。

此外:通过String str = new String("abc");创建出的pool中的String对象实际是没有引用的,这种对象很容易造成内存泄漏,java中的gc会自动在String pool中去清理这些没有引用的String对象。所以我们尽量不要使用new String("abc")的方式去创建String对象,事实上,effective java中也鄙视了这种创建方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值