内存

new一个Object对象占用多少内存?

穿精又带淫゛_ 提交于 2019-11-28 11:15:03
Java的自动内存管理机制( automatic storage management system known as a garbage collector )省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是 G1 的出现,改善了垃圾回收中 stop the world 的状况。 也许很多人都没有考虑过这个问题, new一个Object对象到底占用多少内存呢( Object obj = new Object() )? 这里很明确的是obj是一个指向对象的引用( reference - there are three kinds of reference types: class types,array types, and interface types ),引用的长度决定了Java的寻址能力,32位的JDK是4字节,64位的JDK是8字节( 指针未被压缩的情况下 )。 因为obj对象没有任何数据(field), 会在堆上为它分配空间吗?如果分配空间,里面存储了什么内容? 以面向对象的思维来分析,对象封装了数据和行为,是一个统一的整体,虽然obj对象没有数据,但是有行为(Object类定义了12个方法)。 当我们执行完new操作后,obj的值为堆内存的地址,既然obj都指向一块内存了,说明是 会在堆上为其分配空间 的。 那么分配的空间有多大

文本在内存中的编码(1)——乱码探源(4)

北战南征 提交于 2019-11-27 09:40:44
让我们从一个故事开始说起。话说北大是很有哲学传统的,当你准备踏进北大校门时,连门卫都会连问你三个终极哲学问题: 你是谁?你从哪里来?你要到哪里去? 那么这与我们的问题又有何关系呢?我觉得理解内存中的编码的关键在于理解String类型,因此我们也来探讨一下String的前世今生:String是谁(什么)?String从哪里来?String到哪里去? 当我们能够清晰地回答这三个终极问题时,对文本在内存中的编码也算理解得差不多了。 注:文中将用Java平台为例来探讨这些问题。 String是什么? 要回答这个问题,源码当然是最好的参考。 字符序列(CharSequence) 如果看String类型的声明: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[]; // ... } 可以看到它实现了所谓的CharSequence接口,所以它是一个char序列,内部实质是一个char数组。 也即上述代码中的”char value[]“,(也许你觉得”char[] value“的写法更习惯一些,两者是等价的) 如果再看String的length方法,事实就更清楚了,实际上取的是char数组的长度: public

Android高效显示图片详解(一)

拥有回忆 提交于 2019-11-27 09:04:40
前提与解释: 安卓平台作为一款移动端的应用操作平台,其内存容量是十分有限的,内存资源是十分珍贵的,是无法与传统的桌面平台相比的,因此,在安卓平台下同样的图片操作与处理都要十分谨慎,否则你的程序可以 迅速地消耗可用内存的预算, 最终由于 OutOfMemory导致程序崩溃掉。以下有三个原因说明了我们为什么要谨慎: (1)安卓平台下对应用可使用的系统资源都做出了限制,标准安卓系统下,一个应用程序可用的最大内存为16M,一些第三方ROM 可能会上调这一限制,但是作为应用来说一定要控制自己的内存用量,这并不是可以无限制使用的。 (2)一张高分辨图片的内容耗用量是惊人的, 例如, Galaxy Nexus的 摄像头在拍摄2592X1936像素(5百万像素)。如果位图使用 的是配置 ARGB_8888 (默认的Android 2.3开始),那么此图像加载到内存占用约19MB的内存(2592 * 1936 * 4字节),直接就耗 尽了在某些设备上的每个应用程序的内存上限。 (3)安卓应用程序的一些控件经常需要几个位图一起加载。例如ListView,GridView,ViewPager等控件,并且在使用中还要快速 的滑动,要及时对图片进行更新与回收,更加增加了图片处理的难度。 解决办法: 一,如何去加载与显示大图: 其实,在安卓这样内存有限的平台上,是没有必要按照原始尺寸把一张大图完全加载进来的