1. RAM和ROM
对于手机内存,我们一般会混淆这个概念。手机内存存在两方面的含义。
用来运行程序的RAM,这个可类比于PC中的内存 ,RAM是可读写的,掉电后信息会丢失。手机RAM实际也不是完全意义上的内存,因为手机的RAM一般由两部分组成,其中一部分存放着OS系统的配置/引导文件以及使用手机产生的数据,掉电后RAM上的东西不会丢失,这部分不是运行用的内存(常见的cache、SQLite等消耗的实际上就是这一部分RAM),因此,G1的RAM为192M,但实际其运行用内存并达不到192M;而在手机上还有一种存储介质Flash ROM,这种介质也可以叫做内存(手机上绝大部分都是电子的存储介质,而没有像PC上的硬盘这样的机械式存储介质,所以人们干脆把 Flash ROM也叫作内存),实际类比于PC中的硬盘 ,对于普通用户ROM是只读的(拥有root权限才可以改写ROM),掉电后信息不会丢失。
一般来说,ROM比RAM要大,只有智能手机的ROM和RAM才能达到G级别的容量,而且价格很昂贵。手机所说的4G/8G一般指的是SD存储卡 。J2ME中通过Runtime.getRuntime().freeMemory()得到的数据实际也是RAM数据。
虚拟机堆栈(heap)大小,即内存大小在手机制作过程中已由厂商烧制好,用户无法改动(这个和服务器相关EE程序不同,如果出现内存溢出,你只能从程序中考虑解决)。
对于GPhone,ROM可以理解为操作系统(GPhone的ROM存储的是android OS),好比Windows XP。我们可以在手机的Settings --> About phone中查看ROM的版本号。手机刷机实际就是刷ROM,好比重装系统。GPhone的root权限实际就是管理员权限,好比Windows中的 Administrator,用户只有拥有root权限,才可以刷机。
2. wtk内存
totalMemory()表示调用时刻,java虚拟机现在已经从操作系统那里获取来的内存大小。在java程序运行的过程的,内存总是慢慢的从操作系统那里取的,基本上是用多少取多少。 但是java虚拟机100%的情况下是会稍微多取一点的,这些取过来而又没有用上的内存,实际上就是freeMemory() 。freeMemory()表示调用时刻,java虚拟机现在已经从操作系统那里多获取来的内存大小。所以这2个方法都是没什么实际意义的。想要在真机上得到一个j2me应用程序最多能用多少,可以使用以下方法:写一个最最简单的应用,然后100kb、100kb的循环申请内存直到OutOfMemoryError,看看最多能申请多少内存。
SUN WTK2.5.2模拟器默认情况下只能申请约1.9M。如果想要知道你的应用在不同时刻已经占用内存的情况,可以仿照上述方法。 分享一些我已经测试的真机应用可以申请的最大内存的数据,而且诺基亚多个应用互不干扰,BB没有测多个应用的情况:N95 14800K、N96 16200K、BB8800 34600K。
以上论述针对智能机(动态分配内存,一开始totalMemory很小,以后逐渐增大),非智能机上系统是一次性分配给虚拟机的。
3. GC和RAM
RAM中被应用程序占用的内存是一直会增加的,直至可分配的空间将要耗近时,Java的垃圾回收机制才会启动。才会回收内存。这就是Java的垃圾“自动”回收机制,“自动”,就是一般不回收,直至没有空间了才回收。下面的这张图片是内存被占用的情况,第二个转折点没有上升至最高点就进行内存回收是因为我点击了Run GC。手动回收空间了。