JAVA程序本身是不能直接在计算机上运行的,它需要依赖于硬件基础之上的操作系统和JVM(JAVA虚拟机)。
JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。
这个初始内存和最大内存在一定程度上会影响应用程序的性能。
JVM其实就是操作系统上的一个普通程序(进程名叫java,这个程序可以解释执行class文件,系统中当前运行了多少个java程序就会有多少个java进程)。

当java进程启动时会首先分配一块堆内存(最小内存),以后每当java程序要求JVM(java进程)分配内存时,JVM就会在预先分配的那块内存上为java程序分配内存,
当预先分配的那块内存用完时,JVM会再向操作系统要内存(物理内存),但是JVM不会无限制的向操作系统要内存,当它占用的实际内存达到一个预定值(最大可用内存)时,
如果java程序还向JVM要内存,并且JVM无法通过垃圾回收机制回收当前堆中的内存来为java程序服务时,它就会给程序抛出异常:java.lang.OutOfMemoryError。

其中内存回收时机并不是在用掉内存达到最大可用内存时才进行,它的运行时机是不确定的。可见JVM的最大可用内存就是java程序能够使用的最大内存。
例如:我们把某JAVA程序的JVM最大可用内存设为200M,而我们的物理内存是1G。这种情况下,我们的java程序最多能使用200M内存,虽然我们可能还有800M的内存可用,
但是当我们的程序用掉200M后,如果再要内存,JVM不会因为我们还有800M的内存而为我们分配内存,它会抛出java.lang.OutOfMemoryError异常。

        Runtime runtime = Runtime.getRuntime();
        long maxMemory = runtime.maxMemory();//384M
        long totalMemory = runtime.totalMemory();//10M
        long freeMemory = runtime.freeMemory();//4M

        Log.e("maxMemory:", Long.toString(maxMemory / (1024 * 1024)));//384M
        Log.e("totalMemory:", Long.toString(totalMemory / (1024 * 1024)));//10M
        Log.e("freeMemory:", Long.toString(freeMemory / (1024 * 1024)));//4M

maxMemory:
java虚拟机默认情况下能 从操作系统那里挖到的最大的内存。
如果添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是512*1024*0124字节。

totalMemory:
java虚拟机现在已经从操作系统那里挖过来的内存大小,也就是java虚拟机这个进程当时所占用的所有 内存。
等于monitor memeory里灰色(free)加蓝色(allocated)的总和
1、如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,
基本上是用多少挖多少,直挖到maxMemory()为止,所以totalMemory()是慢慢增大的。
2、如果用了-Xms参数,程序在启动的时候就会无条件的从操作系统中挖- Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖。

freeMemory:
1、如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操 作系统那里挖的,基本上是用多少挖多少,
但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,
实际上就是 freeMemory(),所以freeMemory()的值一般情况下都是很小的,
2、如果你在运行java程序的时候使用了-Xms,这个时候因为程序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,
这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()可 能会有些大。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐