java基础:java.lang.Runtime

Runtime简介

当程序运行时,每个java应用程序都能得到一个运行时的实例,应用程序不能创建这个实例,只能从getRuntime()方法获得RunTime实例。

1. RunTime是单例模式,不能实例化

private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() { 
    return currentRuntime;
}
private Runtime() {}

我们看到源码是单例模式实例(饿汉式,线程安全 但效率比较低 ),设计成单例主要是从节约系统资源来考虑。

2. Runtime几个核心方法

  • exec("notepad");
    在单独的进程中执行指定的字符串命令。


    Paste_Image.png
  • exec("notepad","demo");
    在单独的进程中执行指定命令和变量。
Paste_Image.png
  • availableProcessors();
    向 Java 虚拟机返回可用处理器的数目。
    int num = Runtime.getRuntime().availableProcessors();
    System.out.println("返回本机处理器结果:" + num);
    返回本机处理器结果:4

  • Runtime.getRuntime().freeMemory();
    返回 Java 虚拟机中的空闲内存量。
    Long memory = Runtime.getRuntime().freeMemory();
    System.out.println(memory);

  • gc();
    运行垃圾回收器。
    try {
    Long memoryBefor = Runtime.getRuntime().freeMemory();
    System.out.println("当前内存: "+memoryBefor);
    Runtime.getRuntime().gc();
    Long memoryAfter = Runtime.getRuntime().freeMemory();
    System.out.println("执行完GC后内存:"+memoryAfter);
    } catch (Exception e) {
    e.printStackTrace();
    }
当前内存: 15722728
执行完GC后内存:16027912
  • load(String filename)
    加载作为动态库的指定文件名。

  • maxMemory() ;
    返回 Java 虚拟机试图使用的最大内存量。
    Long maxMemeory = Runtime.getRuntime().maxMemory();
    System.out.println(maxMemeory);
    259522560

  • totalMemory()
    返回 Java 虚拟机中的内存总量。
    try {
    Long freeMemory = Runtime.getRuntime().freeMemory();
    System.out.println(freeMemory);
    Long totalMemory = Runtime.getRuntime().totalMemory();
    System.out.println(totalMemory);
    System.out.println("已使用:" + (totalMemory - freeMemory));
    } catch (Exception e) {
    e.printStackTrace();
    }

15722728
16252928
已使用:530200
  • traceInstructions(on)
    启用/禁用跟踪的指令。如果布尔参数是正确的,该方法表明,Java虚拟机发出调试信息每条指令的执行虚拟机。这些信息的格式,文件或其他输出流释放它,取决于主机环境。虚拟机可能会忽略这个请求,如果它不支持此功能。跟踪输出的目的地是依赖于系统的。
    如果布尔参数是假的,这个方法会导致虚拟机停止执行的详细指令跟踪执行。
    我在本机(hotspot JDK1.8)不管如何测试,都没打印出任何信息,不知是否是虚拟机不支持还是什么情况。
  • traceMethodCalls(on)
    启用/禁用方法调用跟踪,同上。

3. RunTime应用

  • 内存监控

我们可以结合RunTime方法几个特点,做个实时内存监控,如我监控某个方法执行消耗了多少内存
public static void main(String[] args) {
Long freeMemery1,freeMemery2;
try {
Runtime r = Runtime.getRuntime();
freeMemery1 = r.freeMemory();
aa();
freeMemery2 = r.freeMemory();
System.out.println("调用方法aa()使用了" + (freeMemery1 - freeMemery2));
} catch (Exception e) {
e.printStackTrace();
}
}

    public static void aa(){
        byte aa [] = new byte[1024 * 1024];
    }

输出结果:
调用方法aa()使用了1048592

  • JVM实时系统内存监控

读者可根据上面的方法自行实现,实现依据是RunTime是单例的,在单机JVM上拿总内存减去空闲内存即可

  • 系统小工具

可以windows平台上直接调用,如查看java -version
public static void main(String[] args) {
try {
Runtime r = Runtime.getRuntime();
Process process = r.exec("java");
InputStream in = process.getInputStream();
Scanner scanner;
scanner = new Scanner(in);
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}

Paste_Image.png

总结

本文是举例说明了我们常见的几个方法,其中内存监控和exec最为常见。上面示例都实现并测试通过,如有不正确,请批评指正,谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 1,839评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 第一章 初识javaJAVA 第一讲:什么是程序?:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的...
    人子日月几点阅读 507评论 0 1
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,565评论 1 114
  • 夏月偷偷走了 我还是喜庆着小日子与诗 十月延续我的满满心思 好在我的前奏已有准备 准备了好心情去看你的世界 我所剩...
    叶涅夫阅读 328评论 0 0