跳至主要內容
给对象设置null的意义

前言:是否需要把不用的对象设置为null?

1、开始写代码测试(所有测试都要加上以下指令)

jvm参数-Xms20m -Xmx20m -Xmn10m -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=2097152

简单解释一下:

  • -Xms20m -Xmx20m这两个指令限制堆内存固定为20m不允许扩容
  • -Xmn10m代表分配给新生代的总内存为10m
  • -XX:SurvivorRatio=8代表Eden区和Survivor的比例8:1,即新生代被分为3部分,分别8m,1m,1m
  • XX:PretenureSizeThreshold=2097152,这个指令用的比较少,在虚拟机中,普通对象都在新生代分配内存,但是大对象是直接在老年代分配,至于多大算大对象,就是这个参数来设置的,我设置的是2m用来测试(2097152 =2 * 1024 * 1024 ),设置2m是方便我测试,保证我在下面代码设置1m的MB_1对象,内存是在新生代分配,而不是直接进入老年代
  • -XX:+PrintGCDetails打印垃圾回收日志

ChenSino大约 4 分钟javajvm
通过反汇编来看String的拼接

1、先看问题,以下结果是什么?

String s1 = "Hello";
String s2 = "Hello";
String s3 = "Hel" + "lo";
String s4 = "Hel" + new String("lo");
String s5 = new String("Hello");
String s6 = s5.intern();
String s7 = "H";
String s8 = "ello";
String s9 = s7 + s8;
System.out.println(s1 == s2);  
System.out.println(s1 == s3);  
System.out.println(s1 == s4);  
System.out.println(s1 == s9);  
System.out.println(s4 == s5); 
System.out.println(s1 == s6); 

ChenSino大约 3 分钟javajvm字节码反汇编