java内存介绍java --Runtime.getRuntime()内存查看

Java的Runtime类提供了监控内存的方法,如maxMemory()、totalMemory()和freeMemory()。maxMemory()返回JVM能获取的最大内存,totalMemory()表示当前已分配的内存,freeMemory()则是未被使用的内存。文章指出,freeMemory()的值在程序启动初期较小,随着程序运行可能因内存回收而增加。文章通过示例代码解释了这些方法的使用,并提到JVM内存监控的其他工具,如jstat和jconsole。
摘要由CSDN通过智能技术生成

java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法的一些问题,很多人感到很疑惑,为什么,在java程序刚刚启动起来的时候freeMemory()这个方法返回的只有一两兆字节,而随着 java程序往前运行,创建了不少的对象,freeMemory()这个方法的返回有时候不但没有减少,反而会增加。这些人对freeMemory()这 个方法的意义应该有一些误解,他们认为这个方法返回的是操作系统的剩余可用内存,其实根本就不是这样的。这三个方法反映的都是java这个进程的内存情 况,跟操作系统的内存根本没有关系。下面结合totalMemory(),maxMemory()一起来解释。
1.maxMemory()
这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存,以字节为单位,如果在运行java程序的时 候,没有添加-Xmx参数,那么就是64兆,也就是说maxMemory()返回的大约是6410241024字节,这是java虚拟机默认情况下能 从操作系统那里挖到的最大的内存。如果添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是512 * 1024 *1024字节。
2.totalMemory()
这个方法返回的是java虚拟机现在已经从操作系统那里挖过来的内存大小,也就是java虚拟机这个进程当时所占用的所有 内存。如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,直 挖到maxMemory()为止,所以totalMemory()是慢慢增大的。如果用了-Xms参数,程序在启动的时候就会无条件的从操作系统中挖- Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖。
3.freeMemory()
是什么呢,刚才讲到如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操 作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是 freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是如果你在运行java程序的时候使用了-Xms,这个时候因为程 序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()可 能会有些大 。

下面举例说明下:

public class Test {

public static void main(String[] args) {
    try {
        StringBuilder sb = new StringBuilder("abc123456");
        System.out.println("init-total:"+Runtime.getRuntime().totalMemory()/1024/1024);
        System.out.println("init-max:"+Runtime.getRuntime().maxMemory()/1024/1024);
        System.out.println("init-free:"+Runtime.getRuntime().freeMemory()/1024/1024);
        for(int i=0;i<100000000;i++){
            sb.append(new Random().nextInt(88888888) + new Random().nextInt(99999999));
            if(i%1000000==0){
                System.out.println("total:"+Runtime.getRuntime().totalMemory()/1024/1024);
                System.out.println("max:"+Runtime.getRuntime().maxMemory()/1024/1024);
                System.out.println("free:"+Runtime.getRuntime().freeMemory()/1024/1024);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

java初始化内存300M,最大为1000M,执行后发现init-max和init-total和设置类似

最终报内存溢出,从最后内存占用情况进程最大是889M,已经分配879M,相当于把最大内存全部玩过来,可用free内存只剩173M。由于测试是循环100000才打印一次,最后173M在这过程中不足以够用,导致报错.


转自:

在工作中,有时候需要实时去监控内存的使用情况,当然监控java的jvm内存的方法有很多,比如:sun的jdk版本1.5和1.6之后中就带了很多这样的工具,jstat,jps,jstatd,jmap,jinfo,jconsole等一系列,这些工具基本已经能很好的去完成jvm内存,线程等监控工作。

我们现在不需要做这么麻烦的,因为我们只是需要监控项目系统内存的监控,这时候就可以用到java.lang.Runtime。。每个java应用程序都有一个runtime类实例,使应用程序能和运行环境相链接,可以通过getRuntime方法获取当前运行对象,应用程序不能创建自己的 Runtime 类实例。runtime实例对象有且仅有一个Runtime类对象,因为Runtime()方法是单利模式(饿汉模式)进行设计的。

下来我们来看看Runtime类中提供的一些方法:

void

addShutdownHook(Thread hook)
注册新的虚拟机来关闭钩子。

int

availableProcessors()
向 Java 虚拟机返回可用处理器的数目。

Process

exec(String command)
在单独的进程中执行指定的字符串命令。

Process

exec(String[] cmdarray)
在单独的进程中执行指定命令和变量。

Process

exec(String[] cmdarray, String[] envp)
在指定环境的独立进程中执行指定命令和变量。

Process

exec(String[] cmdarray, String[] envp, File dir)
在指定环境和工作目录的独立进程中执行指定的命令和变量。

Process

exec(String command, String[] envp)
在指定环境的单独进程中执行指定的字符串命令。

Process

exec(String command, String[] envp, File dir)
在有指定环境和工作目录的独立进程中执行指定的字符串命令。

void

exit(int status)
通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。

long

freeMemory()
返回 Java 虚拟机中的空闲内存量。

void

gc()
运行垃圾回收器。

InputStream

getLocalizedInputStream(InputStream in)
已过时。 从 JDK 1.1 开始,将本地编码字节流转换为 Unicode 字符流的首选方法是使用 InputStreamReader 和 BufferedReader 类。

OutputStream

getLocalizedOutputStream(OutputStream out)
已过时。 从 JDK 1.1 开始,将 Unicode 字符流转换为本地编码字节流的首选方法是使用 OutputStreamWriter、BufferedWriter 和 PrintWriter 类。

static Runtime

getRuntime()
返回与当前 Java 应用程序相关的运行时对象。

void

halt(int status)
强行终止目前正在运行的 Java 虚拟机。

void

load(String filename)
加载作为动态库的指定文件名。

void

loadLibrary(String libname)
加载具有指定库名的动态库。

long

maxMemory()
返回 Java 虚拟机试图使用的最大内存量。

boolean

removeShutdownHook(Thread hook)
取消注册某个先前已注册的虚拟机关闭钩子。

void

runFinalization()
运行挂起 finalization 的所有对象的终止方法。

static void

runFinalizersOnExit(boolean value)
已过时。 此方法本身具有不安全性。它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,从而导致不正确的行为或死锁。

long

totalMemory()
返回 Java 虚拟机中的内存总量。

void

traceInstructions(boolean on)
启用/禁用指令跟踪。

void

traceMethodCalls(boolean on)
启用/禁用方法调用跟踪。

以上方法来自于Runtime类api文档,因为Runtime继承类java.lang.Object,因此也继承了Object类的一些方法:clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait。

我们现在需要做内存监控暂时不需要全部去了解Runtime类的方法,只需要去看表格中“蓝色”标记的方法。

getRuntime
public static Runtime getRuntime(){
Return currentRuntime;
}
1.
2.
3.
返回与当前 Java 应用程序相关的运行时对象。Runtime类的大多数方法是实例方法,并且必须根据当前的运行时对象对其进行调用。

返回:

与当前 Java 应用程序相关的 Runtime 对象。

totalMemory
public native long totalMemory();

返回 Java 虚拟机中的内存总量。此方法返回的值可能随时间的推移而变化,这取决于主机环境。

注意,保存任意给定类型的一个对象所需的内存量可能取决于实现方法。

返回:

目前为当前和后续对象提供的内存总量,以字节为单位。

maxMemory
public native long maxMemory();

返回 Java 虚拟机试图使用的最大内存量。如果内存本身没有限制,则返回值 Long.MAX_VALUE。

返回:

虚拟机试图使用的最大内存量,以字节为单位。

gc
public native void gc();

运行垃圾回收器。调用此方法意味着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制从方法调用中返回时,虚拟机已经尽最大努力回收了所有丢弃的对象。

名称 gc 代表“垃圾回收器”。虚拟机根据需要在单独的线程中自动执行回收过程,甚至不用显式调用 gc 方法。

方法 System.gc() 是调用此方法的一种传统而便捷的方式。

当我们了解了以上方法时,就可以动手去实现我们自己的功能了。

登录后复制
//当前JVM占用的内存总数(M)

double total = (Runtime.getRuntime().totalMemory()) / (1024.0 * 1024);

//JVM最大可用内存总数(M)

double max = (Runtime.getRuntime().maxMemory()) / (1024.0 * 1024);

//JVM空闲内存(M)

double free = (Runtime.getRuntime().freeMemory()) / (1024.0 * 1024);

//可用内存内存(M)

double mayuse=(max - total + free);

//已经使用内存(M)

double used=(total-free);

java --Runtime.getRuntime()内存查看
https://blog.51cto.com/u_13270529/5962144

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值