java的内存控制效率优化
来源:互联网 发布:网关mac地址怎么查 编辑:程序博客网 时间:2024/06/05 21:51
来自《java程序员 ——上班那点事儿》4.4 内存控制效率优化的启示
1、new String(“asdf”)和"asdf"
对于 String 这个类来说它可以用两种方法进行建立:
和
String s = new String("asdf");
String s = "asdf";
用这两个形式创建的对象是不同的, 第一种是用new()来创建对象的, 它是在堆上开辟 空间,每调用一次都会在堆上创建一个新的对象。
而第二种的创建方法则是先在栈上创建一个String 类的对象引用,然后再去查找栈中 有没有存放"asdf",如果没有,则将"asdf"存放进栈,并让 str 指向"asdf",如果已经有 "asdf" 则直接把 str 指向"abc"。
我们可以通过"= ="判断是否相等来验证栈上面的数据共享的问题。
例1:
String s1 = "asdf"; String s2 = "asdf"; System.out.println(s1==s2);
该程序的运行结果是,"true",那么这说明"s1"和"s2"都是指向同一个对象的。
例2:
String s1 =new String ("asdf"); String s2 =new String ("asdf"); System.out.println(s1==s2);
该程序的运行结果是,"false",这说明用 new 的方式是生成的对象,每个对象都指向不同 的地方。
2、StringBuffer比String省内存和时间
3、二维数组比一维数组占用更多内存空间
有时候我们一厢情愿的认为:
二维数组的占用内存空间多无非就是二维数组的实际数组元素数比一维数组多而已,那 么二维数组的所占空间,一定是实际申请的元素数而已。
但是, 事实上并不是这样的, 对于一个二维数组而言, 它所占用的内存空间要远远于大 它开辟的数组元素数
开辟了"1024*1024*2"即2M 的数组元素的一维数组, 运行这个程序得到的结果提示"已占用内存:3M"。
当我们把申请的元素数量未变, 只是将二维数组的行数定为"1024*1024"列数定为"2",和刚 才的那个一维数组 "1024*1024*2"的数量完全一致,但我们得到的运算结果竟然占用达到了29M 的空间。
4、用 HashMap 提高内存查询速度,但是增加赋值时间和内存占用
普通数组:
取值结果:3145728
赋值循环时间:2464ms
获取循环时间:70msJava 可控内存:1016M
已占用内存:128M
HashMap:
取之结果:3145727
赋值循环时间:16454ms
获取循环时间:0ms
Java 可控内存:1016M
已占用内存:566M
代价:
赋值循环时间:
HashMap:16454ms
普通数组:2464ms
占用内存:
HashMap:566M
普通数组:128M
5、用"arrayCopy()"提高数组截取速度
- java的内存控制效率优化
- Java中的内存和效率优化(持续更新)
- cocos2d-x 内存和效率的优化(一)
- java网站效率优化
- JAVA代码效率优化
- java代码效率优化
- JAVA代码效率优化
- java代码效率优化
- Java对象的内存控制
- java 性能优化:提升 java 代码的运行效率
- PHP的效率优化
- PHP的效率优化
- 优化递归的效率
- DPDK的效率优化
- java反射效率及优化
- 提高Java程序内存效率
- java 内存映射效率好高啊
- Java的内存复制(主要是数组)效率比较
- DICOM命令集和数据集解析
- DICOM中的入门概念
- Vimperator —— 用键盘畅游网络
- 从这个帖子说开“稀疏向量的计算方法”
- MDA工具
- java的内存控制效率优化
- 解释EJB相关术语
- 开发想转测试的问题
- WaitForSingleObject函数用法
- 这两天很忙
- C++内存管理详解
- ANDROID Porting系列七、Display Drivers
- C函数详细说明(1)
- 妈妈的生日