背景:之前生产遇到一次问题就是系统卡顿,排查之后发现就是大量代码有for循环内频繁创建对象的现象
方式一:方法内创建
private void methodInnter(){
List<String> list = new ArrayList<>();
for (int i = 0; i<1000 ;i++) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("AAA"+i);
System.out.println("添加AAA"+i);
list.add(stringBuilder.toString());
}
}
方式二:方法内创建
private void methodOuter(){
List<String> list = new ArrayList<>();
StringBuilder stringBuilder;
for (int i = 0; i<1000 ;i++) {
stringBuilder = new StringBuilder();
stringBuilder.append("AAA"+i);
System.out.println("添加AAA"+i);
list.add(stringBuilder.toString());
}
}
通俗解释:
在for循环内部创建的话,每次执行循环都会创建对象,没什么特别明显坏处,只是会消耗内存。所以我们通常在for循环外部实例化对象,因为它执行一次,StringBuilder stringBuilder是创建对象引用,引用的实例地址。 new StringBuilder()是创建对象实例,两者都会占用系统资源。
改进之前for循环中创建了10次引用和10实例,改进后是创建了1次引用,10实例。在方法执行完后内存资源会被回收
待研究,就是通过什么软件可以验证具体逻辑,JProfile可以看到堆占用的情况
参考:
1、 https://www.cnblogs.com/qlqwjy/p/7598773.html