`
yzjiang8888
  • 浏览: 41931 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

谈谈Runtime类中的freeMemory,totalMemory,maxMemory等几个方法

阅读更多
最近在网上看到一些人讨论到java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法的一些问题,很多人感到很疑惑,为什么,在java程序刚刚启动起来的时候freeMemory()这个方法返回的只有一两兆字节,而随着 java程序往前运行,创建了不少的对象,freeMemory()这个方法的返回有时候不但没有减少,反而会增加。这些人对freeMemory()这 个方法的意义应该有一些误解,他们认为这个方法返回的是操作系统的剩余可用内存,其实根本就不是这样的。这三个方法反映的都是java这个进程的内存情 况,跟操作系统的内存根本没有关系。下面结合totalMemory(),maxMemory()一起来解释。
maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存,以字节为单位,如果在运行java程序的时 候,没有添加-Xmx参数,那么就是64兆,也就是说maxMemory()返回的大约是64*1024*1024字节,这是java虚拟机默认情况下能 从操作系统那里挖到的最大的内存。如果添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是512*1024*0124字节。


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


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


把下面的源代码编译以后,在class文件所在的目录里面,分别用java -cp . Untitled1 和java -cp . -Xms80m -Xmx80m Untitled1 运行,看看结果如何,有助于理解上面的阐述。

public class Untitled1 {    
  public Untitled1() {}    
  public static void main(String[] args) {
    System.out.println(Runtime.getRuntime().freeMemory());
    System.out.println(Runtime.getRuntime().totalMemory());
    System.out.println(Runtime.getRuntime().maxMemory());
    long t = System.currentTimeMillis();
    try {
      Thread.sleep(30000);
    } catch (Exception ee) {
      ee.printStackTrace();
    }
    String[] aaa = new String[2000000];
    System.out.println(Runtime.getRuntime().freeMemory());
    System.out.println(Runtime.getRuntime().totalMemory());
    System.out.println(Runtime.getRuntime().maxMemory());
    try {
      Thread.sleep(30000);
    } catch (Exception ee) {
      ee.printStackTrace();
    }
    for (int i = 0; i < 2000000; i++) {
      aaa[i] = new String("aaa");
    }
    System.out.println(Runtime.getRuntime().freeMemory());
    System.out.println(Runtime.getRuntime().totalMemory());
    System.out.println(Runtime.getRuntime().maxMemory());
    try {
      Thread.sleep(30000);
    } catch (Exception ee) {
      ee.printStackTrace();
    }
  }
}


转自: http://sitemasterkit.com/archives/133
分享到:
评论
4 楼 神奇九寨沟 2011-11-09  
不错
3 楼 zzw0309452 2009-12-17  
说的很好 哈哈
2 楼 szhnet 2009-12-09  
也就是说totalMemory-freeMemory等于jvm真正已经使用的内存了
1 楼 skcmm 2009-09-25  
学习了 刚好看到此篇

相关推荐

    java中获取CPU 内存的方法

    获取内存信息相对简单,可以直接通过`Runtime.getRuntime()`获取到`Runtime`实例,然后调用其`totalMemory()`, `freeMemory()`, 和`maxMemory()`方法来获取Java堆内存的相关数据。对于物理内存的信息,可能需要使用...

    java-读取任务管理器信息

    在 MonitorInfoBean 类中,使用 Runtime 类的 getRuntime() 方法来获取当前的 Runtime 对象,然后使用 Runtime 对象的 availableProcessors() 方法来获取 cpu 的数量,使用 totalMemory() 方法来获取总的物理内存,...

    Java Runtime用法实战案例

    该方法返回一个Runtime对象,该对象提供了一些方法来获取系统的内存信息,例如maxMemory()、totalMemory()、freeMemory()等。 maxMemory()方法:返回当前系统的最大可用内存大小。 totalMemory()方法:返回当前...

    System 类 和 Runtime 类的常用用法介绍

    `Runtime.getRuntime().freeMemory()` 和 `totalMemory()` 可以分别获取 Java 虚拟机(JVM)当前可用和总内存。`maxMemory()` 返回 JVM 的最大内存分配。这些方法有助于监控和优化内存使用。 3. 停止程序: `halt...

    Android获取App内存使用情况的方法

    此外,还可以使用 Runtime.getRuntime().totalMemory() 和 Runtime.getRuntime().freeMemory() 方法分别获取当前 App 的总内存和剩余内存。 ```java float totalMemory = (float) (Runtime.getRuntime().total...

    java程序实现获取计算机cpu利用率和内存使用信息.doc

    我们可以使用 `totalMemory()` 方法获取总的内存大小,`freeMemory()` 方法获取剩余的内存大小,`maxMemory()` 方法获取最大可使用的内存大小。 使用 MonitorInfoBean 存储信息 在获取了计算机的 CPU 利用率和内存...

    Java获取系统信息(cpu,内存,硬盘,进程等)的相关方法.pdf

    Java 的 Runtime 类提供了获取系统内存信息的方法,包括 freeMemory()、totalMemory() 和 maxMemory()。OperatingSystemMXBean 是 Java 的一个管理接口,提供了获取系统 CPU、内存、硬盘等信息的方法。 通过使用这...

    Runtime 源码分析

    在Java编程语言中,`Runtime`类是每个Java应用程序的核心组成部分。它提供了与运行时环境交互的方法,使得程序能够执行一些系统级别的操作,如启动新进程、管理内存或者与操作系统进行交互。`Runtime`类是单例的,...

    java读取CPU内存信息

    例如,通过`Runtime.getRuntime().freeMemory()`可以获得当前JVM的空闲内存,`totalMemory()`返回总内存,而`maxMemory()`则返回JVM的最大可用内存。要获取物理内存信息,通常需要借助于操作系统的API,这在Java中...

    java获取cpu、内存信息

    Java的`java.lang.Runtime`类提供了获取系统内存的方法,而`java.lang.management.MemoryMXBean`和`MemoryUsage`类则提供了更详细的内存使用情况。以下是一些常见的内存获取代码: ```java import java.lang....

    javamemory_JAVA内存监视器_java_

    在实现自我监视内存使用的程序时,可以定期获取`Runtime.getRuntime().totalMemory()`、`freeMemory()`和`maxMemory()`等方法返回的值,来计算当前内存的使用情况,包括已分配的总内存、剩余的自由内存以及系统允许...

    关于(java heap space)内存溢出的解决办法

    System.out.println("Total Memory: " + runtime.totalMemory()); System.out.println("Free Memory: " + runtime.freeMemory()); System.out.println("Max Memory: " + runtime.maxMemory()); } } ``` 总结,...

    JVM之参数分配(全面讲解)

    System.out.println("total memory:" + Runtime.getRuntime().totalMemory()); byte[] b1 = new byte[1*1024*1024]; System.out.println("分配了1M"); System.out.println("max memory:" + Runtime.getRuntime...

    java在cpu的占有率

    long totalMemory = Runtime.getRuntime().totalMemory() / kb; // 剩余内存 long freeMemory = Runtime.getRuntime().freeMemory() / kb; //java使用的内存 long javaUseMemory = totalMemory - free...

    java获取电脑信息demo

    System.out.println("空闲内存 (MB):" + (runtime.freeMemory() / (1024 * 1024))); System.out.println("最大可用内存 (MB):" + (runtime.maxMemory() / (1024 * 1024))); } } ``` 如果需要获取硬件信息,...

    在java代码中获取JVM参数的方法

    int totalMemory = (int) Runtime.getRuntime().totalMemory() / 1024; // 总内存,以KB为单位 System.out.println("总的内存量 i is " + totalMemory); ``` 5. 获取Java虚拟机中的空闲内存量: ```java int ...

    linux下tomcat设置参照.pdf

    out.println("Total Memory: " + lRuntime.totalMemory() + " "); out.println("Available Processors : " + lRuntime.availableProcessors() + " "); out.println("*** END MEMORY STATISTICS ***"); %&gt; ``...

    简单谈谈Java垃圾回收

    3. `freeMemory()`, `totalMemory()`, `maxMemory()`:这些方法用于获取JVM当前的内存状态,如空闲内存、总内存和最大可用内存。 四、引用类型和可达性状态 Java提供了不同强度的引用类型,允许对对象的可达性进行...

    浅析Java中的GC垃圾回收器的意义及与GC的交互

    `gc()`方法用于请求垃圾回收,`runFinalization()`方法用于运行待执行的终结器(finalize方法),`freeMemory()`、`totalMemory()`和`maxMemory()`方法分别用于获取当前可用内存、总内存和最大内存的估计值。...

    任务管理器

    开发者可以使用`java.lang.Runtime`类的`totalMemory()`, `freeMemory()`和`maxMemory()`方法获取内存使用情况。另外,`jmap`和`VisualVM`等工具提供更详细的内存分析。 4. **性能监控**: 要监控Java应用程序的...

Global site tag (gtag.js) - Google Analytics