您好,老师,这一块为什么要这么写

来源:12-5 前后台订单列表,订单详情,发货功能开发

慕函数9708254

2018-05-10

private List<OrderVo> assembleOrderVoList(List<Order> orderList,Integer userId){

        List<OrderVo> orderVoList = Lists.newArrayList();

        for(Order order : orderList){

            List<OrderItem>  orderItemList = Lists.newArrayList();//这一块每次循环都会创建对象,对于前台用户来说,可能订单项不是太多,没太大影响,可是针对于后台管理员的查询,那么它是有所有用户订单项,会不会内存泄漏?我也只是根据我的浅显知识分析,也可能不对,请老师帮我说明一下,谢谢

            if(userId == null){

                //todo 管理员查询的时候 不需要传userId

                orderItemList = orderItemMapper.getByOrderNo(order.getOrderNo());

            }else{

                orderItemList = orderItemMapper.getByOrderNoUserId(order.getOrderNo(),userId);

            }

            OrderVo orderVo = assembleOrderVo(order,orderItemList);

            orderVoList.add(orderVo);

        }

        return orderVoList;

    }


写回答

4回答

Geely

2018-05-14

你好,这里不会内存泄露的。首先这个方法上一层是分页的,也就是结果集的size可控。

另外在方法里new出来的对象回收很快的哟~如果fullgc不频繁 这么写都没关系。除非这个size非常大。但是我们size在分页可控的,所以不必担心哈。

1
0

polo哦

2018-05-11

首先这个是局部变量,其次java有非常nice的垃圾回收机制,等这个函数结束完,引用不再被调用的时候就会清除掉,不太可能造成内存泄漏

1
0

慕函数9708254

提问者

2018-05-14

谢谢老师,我懂了,没有想到分页,重点跑偏了,没有综合去看,另外你说的fullgc 我不太懂,不过我打算看下这个jvm虚拟机的回收机制,谢谢老师的回答,您解决了我的问题,另外我得攒一波老师,您讲的第二期也非常棒,讲解过程逻辑非常清晰,而且也很有耐心,最近刚辞职,因为想到自己职业规划的问题,希望看了您的视频之后,能让我再找到工作,还没看完,不过很谢谢您,后期我还会来和您学习我不知道的东西,谢谢您

0
2
Geely
fullgc可以查查,垃圾回收机制里面的,也比较简单,还有young gc。eden s0 s1区的置换等。
2018-05-19
共2条回复

慕函数9708254

提问者

2018-05-11

是有回收机制,也是局部变量引用,可是在方法没结束完的这个过程的的确确在堆内存中产生了大量的订单项数量对应arraylist 对象实例,回收机制是在方法完成后进行回收,还是在方法执行过程中不停的回收未被使用的对象,我们是不可去控制的,其次,我知道jvm会在运行过程中可能动态的去申请堆内存,可是也有个极限吧。所以我不能确定你说的这个,我很感谢你的回答,但是我还是没有搞清,哎,头好大,都怪自己原理理解的不透彻

0
1
Geely
这个没关系吗,慢慢来 先了解jvm内存结构,不断体会思考即可。不要着急哈,我们一步一步来。
2018-05-19
共1条回复

从0开始 独立完成企业级Java电商网站服务端开发

前后端分离,数据库接口设计,架构设计,功能开发,上线运维

9476 学习 · 8804 问题

查看课程