文档章节

引用回收时机

KongFanhao
 KongFanhao
发布于 2016/12/05 10:27
字数 681
阅读 6
收藏 0

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

// 注:提取出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++,对象会在栈中存储,因为对象的生命周期都是程序员自己控制的)

引用是存在栈中的,因为有确切的生命周期,栈指针的移动是非常快的,到生命周期结束内存就释放了。
所以回到上面的话题,这句话在循环内部是可以的。

© 著作权归作者所有

上一篇: firefox 问题
下一篇: String 不可变性
KongFanhao
粉丝 5
博文 76
码字总数 42265
作品 0
海淀
程序员
私信 提问
Java 中的 GC -- GC基础常识

---------- 文中讨论的GC原理均基于 Sun Hotspot JVM,对于不同 JVM 实现可能会有不同。 1. GC (Gabage Collector) 做了什么事情 决定哪些内存需要回收(物理内存的位置)。 决定何时回收这...

longjuelegend
2016/08/30
26
0
Java程序员的日常—— 垃圾回收中引用类型的作用

在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情。因此了解垃圾回收的相关知识就显得很重要了。 引用,...

青夜之衫
2017/12/05
0
0
Android内存泄漏检测LeakCanary,原理分析,解决方案

> LeakCanary使用及内存检测 LeakCanary使用教程- https://blog.csdn.net/feather_wch/article/details/79223776 LeakCanary的一个小Demo- https://github.com/NewBrandSTONE/MyLeakActivity......

desaco
01/23
0
0
GC垃圾回收算法

什么是GC垃圾回收呢。日常生活中我们去餐厅吃饭吃完饭,吃完饭走了餐具不用管,服务员在把餐具拿走,这是一种方式,服务员怎么知道他要来把餐具拿走呢,因为你走了,这个位置空了。服务员什么...

分享达人
2016/04/10
0
0
Java中的对象和垃圾回收

1.java语言中的对象、数组等引用类型实体,系统都会为它在堆内存里面分配内存空间,当这个内存空间没有被引用时,java就会自动把它当做垃圾回收。垃圾回收机制有以下特点,垃圾回收机制只负责...

西红柿的眼泪
2016/07/09
7
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 满周岁就去挣钱!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ tom_tdhzz:一直期待了很久,这是第二次来圆明园,也是特意来这里,只是才发现只有历史现实不在了。#今日歌曲推荐# 分享王晰的单曲《南屏晚...

小小编辑
40分钟前
419
9
解决Structure needs cleaning

简介 今天在同步文件的时候有一个目录突然报错 Structure needs cleaning 百度了一下发现使用xfs_repair可以解决 操作 因为我做的是raid5 ,可能是昨天我重启了机器的缘故,所以我要做的是先...

bboysoulcn
今天
6
0
Dubbo服务暴露与注册

前面的文章中,我们讲解了Dubbo是如何进行配置的属性的初始化的,并且讲到,Dubbo最终会将所有的属性参数都封装为一个URL对象,从而以这个URL对象为基准传递参数。本文则主要讲解Dubbo是如何...

爱宝贝丶
今天
4
0
Leetcode PHP题解--D88 696. Count Binary Substrings

D88 696. Count Binary Substrings 题目链接 696. Count Binary Substrings 题目分析 给定一个01字符串,返回仅用连续的0和1串所能组成的二进制字符串个数。 例如,00110011,就包含0011,0...

skys215
今天
4
0
基础工具类

package com.atguigu.util;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid......

architect刘源源
今天
103
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部