Runtime 类

简介:

  关于 Java 中的 Runtime 类对象,每一个 Java 应用都只有一个 Runtime 对象单实例,而 Runtime 类是不能通过 new 方法创建的。因为在这个类中,它将其构造方法私有化了,并提供了一个恶汉式的单例设计模式来获得 Runtime 对象。下面是这个类上述中的关键代码:

public class Runtime {
    private static Runtime currentRuntime = new Runtime();

    public static Runtime getRuntime() {
        return currentRuntime;
    }

    private void Runtime() {};
}

  
  Runtime 有三个查看 Java 应用与内存相关的方法,freeMemory, totalMemory, maxMemory,现在通过代码展示了解一下:

public class Test {
    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();
        // 返回 java 虚拟机将会尝试去获取的最大内存容量
        System.out.println("系统最大可用空间: " + convertBytesToM(runtime.maxMemory()));  
        // 返回 java 虚拟机的总共内存量。这个值将会随着时间变化,具体取决于主机环境。
        System.out.println("系统总共内存量: " + convertBytesToM(runtime.totalMemory()));
        // 返回java虚拟机可用的内存容量。可以调用 gc 方法来增加 freeMemory
        System.out.println("系统可用内存量:" + convertBytesToM(runtime.freeMemory())); 

    }
    private static long convertBytesToM(long bytes) {
        return bytes/1024/1024;
    }
}

  在我的本机上,结果显示如下:

image

尝试创建对象来提高 java 虚拟机占用的总内存和减少可用内存,并使用“垃圾回收”方法,来提高 freeMemory

  代码如下:

public class Test {
    public static void main(String[] args) {

        Runtime runtime = Runtime.getRuntime();
        // 返回 java 虚拟机将会尝试去获取的最大内存容量
        System.out.println("1.系统最大可用空间: " + convertBytesToM(runtime.maxMemory()) + " MB");
        // 返回 java 虚拟机的总共内存量。这个值将会随着时间变化,具体取决于主机环境。
        System.out.println("1.系统总共内存量: " + convertBytesToM(runtime.totalMemory()) + " MB");
        // 返回java虚拟机可用的内存容量。可以调用 gc 方法来增加 freeMemory
        System.out.println("1.系统可用内存量:" + convertBytesToM(runtime.freeMemory()) + " MB");
        System.out.println("-----------------------------------------------------------");

        String garbageStr = "";
        for (int i = 0; i < 20000; i++) {
            garbageStr += i;
        }
        System.out.println("2.系统最大可用空间: " + convertBytesToM(runtime.maxMemory()) + " MB");
        System.out.println("2.系统总共内存量: " + convertBytesToM(runtime.totalMemory()) + " MB");
        System.out.println("2.系统可用内存量:" + convertBytesToM(runtime.freeMemory()) + " MB");
        System.out.println("-----------------------------------------------------------");

        runtime.gc();
        System.out.println("3.系统最大可用空间: " + convertBytesToM(runtime.maxMemory()) + " MB");
        System.out.println("3.系统总共内存量: " + convertBytesToM(runtime.totalMemory()) + " MB");
        System.out.println("3.系统可用内存量:" + convertBytesToM(runtime.freeMemory()) + " MB");
    }

    private static long convertBytesToM(long bytes) {
        return bytes/1024/1024;
    }
}

  结果如下显示:
image

  当创建循环创建字符串对象之后, Java 应用总内存根据主机情况从 307 MB ---> 1783 MB,而对象占用了有 1783 - 1687 = 96 MB 的内存。其中有很多是废弃的对象,但同时占用了内容。Java 虚拟机的垃圾回收机制会在需要的时候回收这些垃圾对象,它的处理是另开一个独立的线程即使程序并没有显式地去调用。 不过有时,我们可能出于当前情况性能的考虑,需要立即进行垃圾对象回收,这时就可以调用 gc() 方法。如上图所示,调用此方法后,系统回收了相当一部分内存,1687 ---> 1751.

相关文章
|
存储 Java 编译器
JVM-不同jdk版本静态变量存储位置
JVM-不同jdk版本静态变量存储位置
|
存储 JSON 应用服务中间件
Higress的日志收集中,底层用的是Envoy,可不可以实现类似NGINX的rsyslog发送?
【2月更文挑战第30天】Higress的日志收集中,底层用的是Envoy,可不可以实现类似NGINX的rsyslog发送?
174 2
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
358 21
|
边缘计算 人工智能 安全
探索边缘计算:架构、优势及未来趋势
探索边缘计算:架构、优势及未来趋势
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
368 5
|
JavaScript 前端开发 测试技术
理解 Proxy 和 Object.defineProperty:提升你的 JavaScript 技能(上)
理解 Proxy 和 Object.defineProperty:提升你的 JavaScript 技能(上)
理解 Proxy 和 Object.defineProperty:提升你的 JavaScript 技能(上)
|
自然语言处理 搜索推荐 数据挖掘
电商 API 接口:电商领域的强大技术引擎
在数字化浪潮中,电商API接口作为连接系统的桥梁,已成为电商市场的核心技术引擎。它通过实时库存信息、多样化支付等功能提升用户体验,支持自动化订单处理,促进数据流通与分析,并允许定制化开发,集成移动应用,从而增强系统灵活性和业务竞争力。
|
分布式计算 资源调度 Hadoop
MapReduce分布式编程
MapReduce分布式编程
440 1
|
算法 Python
python实现井字棋小游戏(使用蒙特卡洛搜索树进行训练)
python实现井字棋小游戏(使用蒙特卡洛搜索树进行训练)
355 1
|
Python
python setup.py bdist_wheel 报错的处理办法
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...] or: setup.py --help [cmd1 cmd2 .
12941 0