`
zengguo1988
  • 浏览: 280044 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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

    博客分类:
  • J2EE
阅读更多
最近在网上看到一些人讨论到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 运行,看看结果如何,有助于理解上面的阐述。
  1. public class Untitled1 {      
  2.   public Untitled1() {}      
  3.   public static void main(String[] args) {  
  4.     System.out.println(Runtime.getRuntime().freeMemory());  
  5.     System.out.println(Runtime.getRuntime().totalMemory());  
  6.     System.out.println(Runtime.getRuntime().maxMemory());  
  7.     long t = System.currentTimeMillis();  
  8.     try {  
  9.       Thread.sleep(30000);  
  10.     } catch (Exception ee) {  
  11.       ee.printStackTrace();  
  12.     }  
  13.     String[] aaa = new String[2000000];  
  14.     System.out.println(Runtime.getRuntime().freeMemory());  
  15.     System.out.println(Runtime.getRuntime().totalMemory());  
  16.     System.out.println(Runtime.getRuntime().maxMemory());  
  17.     try {  
  18.       Thread.sleep(30000);  
  19.     } catch (Exception ee) {  
  20.       ee.printStackTrace();  
  21.     }  
  22.     for (int i = 0; i < 2000000; i++) {  
  23.       aaa[i] = new String("aaa");  
  24.     }  
  25.     System.out.println(Runtime.getRuntime().freeMemory());  
  26.     System.out.println(Runtime.getRuntime().totalMemory());  
  27.     System.out.println(Runtime.getRuntime().maxMemory());  
  28.     try {  
  29.       Thread.sleep(30000);  
  30.     } catch (Exception ee) {  
  31.       ee.printStackTrace();  
  32.     }  
  33.   }  


转自: http://sitemasterkit.com/archives/133
分享到:
评论
1 楼 jimylion 2010-10-09  
-Xmx如果不设置,它的默认值是多少呢?在哪里能找到呢?

相关推荐

    java中获取CPU 内存的方法

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

    Java软件开发实战 Java基础与案例开发详解 9-3 Rintime类的使用 共6页.pdf

    `Runtime`类是Java标准库中的一个重要组成部分,它提供了应用程序与运行环境之间交互的能力。由于Java程序本身是跨平台的,`Runtime`类的存在使得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...

    Java基础学习15.pdf

    1. Java中的Runtime类以及它的常见方法如freeMemory(), totalMemory(), maxMemory(),这些方法分别用于获取JVM当前可用的内存量、已经分配的总内存量、以及JVM最大可用的内存量。还有一个方法availableProcessors()...

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

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

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

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

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

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

    Runtime 源码分析

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

    java获得jvm内存大小

    `Runtime`类提供了几个有用的方法,包括: - `totalMemory()`:返回当前JVM堆内存的总量,以字节为单位。 - `maxMemory()`:返回JVM堆内存的最大值,即JVM启动时设定的最大堆内存容量。 - `freeMemory()`:返回JVM...

    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()); } } ``` 总结,...

    Java中级程序员面试题(重点)

    - 使用`java.lang.Runtime`类的`freeMemory()`、`totalMemory()`和`maxMemory()`方法可以获取Java程序的内存使用情况。通过计算`totalMemory()`与`freeMemory()`的差值可以得到当前堆内存使用量,进一步可以得出堆...

    java获得CPU使用率.doc

    - 在Java中,可以通过`Runtime`类来获取系统的内存信息,如总内存、空闲内存等。 4. **获取CPU使用率**: - 对于Windows系统,可以通过读取系统性能计数器或使用`WMI (Windows Management Instrumentation)`来...

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    - `Runtime.getRuntime().totalMemory()`:返回当前JVM的总内存,包括已使用和空闲内存。 此外,还可以使用JConsole、VisualVM等工具,更直观地监控和分析JVM内存使用情况,这对于性能调优和问题排查极为有益。 ##...

Global site tag (gtag.js) - Google Analytics