博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
引用回收时机
阅读量:6221 次
发布时间:2019-06-21

本文共 1321 字,大约阅读时间需要 4 分钟。

hot3.png

由下面一段代码引发的思考:

// 注:提取出list中的人员 3个一组if (baList != null && baList.size() > 0) {	EntMajorPerson emp = new EntMajorPerson();  ☆         	for (int i = 0; i < (baList.size() / 3);) {		// EntMajorPerson emp = new EntMajorPerson();		Integer num = Integer.valueOf(baList.get(i));		emp.setSerialNumber(num);		emp.setFullName(baList.get(i + 1));		emp.setPost(baList.get(i + 2));		emp.setRegisterLinkId(registerLinkId);		emp.setCreateTime(getCreateTime());		entMajorPersons.add(emp);		i += 3;	}	if (entMajorPersons.size() != 0) {		DataManager.addDatas(DataManager.EntMajorPersonMapper_Key, entMajorPersons);	}}

 

上文中打重点符号的这句话如果在for循环的外部试想会有什么后果?

直接现象就是,每回存储用的都是一个对象,后一个对象的属性如果为空值,那么前一个的属性就覆盖过来了,会发生错误。
解决办法就是将创建对象这句话放到循环里面,每次都创建一个新的对象。
但细想一步,每次都创建一个对象,会不会降低效率,消耗更多内存呢?

☆答案是否定的

引用之前的TIJ中的内存分析的一段:

2. 栈(又名堆栈),原型就是碟盘子模型,先放的盘子后拿。栈位于通用RAM(随机访问存储器)中,但通过堆栈指针可以直接从处理器那里获得直接支持。通过栈顶指针的上下移动来创建和释放内存,这是一种快速有效的分配存储的方法,仅次于寄存器。但是这种方式,java系统必须知道存储在堆栈内所有项的生命周期,以便上下移动堆栈指针。所以对象的引用存在与堆栈中(因为有确切的生命周期),但是对象不会存于堆栈中(无确切的生命周期)。

3.堆。一种通用的内存池,也是位于RAM区,用于存放所有的java对象。堆不同与堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储由很大的灵活性。当需要一个对象时,只需new一个,当执行时,会自动在堆里进行分配内存。当然,为了这种灵活性必须付出相应的代价:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。(对比于C++,对象会在栈中存储,因为对象的生命周期都是程序员自己控制的)

引用是存在栈中的,因为有确切的生命周期,栈指针的移动是非常快的,到生命周期结束内存就释放了。

所以回到上面的话题,这句话在循环内部是可以的。

转载于:https://my.oschina.net/u/2561483/blog/799918

你可能感兴趣的文章
图解mapreduce原理和执行过程
查看>>
自动化运维必备-PXE批量安装系统
查看>>
算法——跳跃搜索
查看>>
MLlib协同过滤ALS算法初探
查看>>
记一次线上 redis 使用分布式锁坑
查看>>
Xshell_4.0绿色版
查看>>
PHP&Apache配置多个域名解析的配置方法
查看>>
JavaScript实用资源
查看>>
Linux pipe
查看>>
difference between -Xss and -XX:ThreadStackSize
查看>>
Linux 下编译安装 NGiNX
查看>>
linux if 命令判断条件总结
查看>>
二叉树
查看>>
赋予用户库的读写权限
查看>>
PHP取得用户真实IP
查看>>
XML文档语法 学习笔记
查看>>
组织级安全编码实践
查看>>
国内外SNS比较分析
查看>>
谈PCIe ssd在数据库优化中的作用
查看>>
《Android移动网站开发详解》
查看>>