zoukankan      html  css  js  c++  java
  • Runtime 类

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

    1. publicclassRuntime{
    2. privatestaticRuntime currentRuntime =newRuntime();
    3. publicstaticRuntime getRuntime(){
    4. return currentRuntime;
    5. }
    6. privatevoidRuntime(){};
    7. }

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

    1. publicclassTest{
    2. publicstaticvoid main(String[] args){
    3. Runtime runtime =Runtime.getRuntime();
    4. // 返回 java 虚拟机将会尝试去获取的最大内存容量
    5. System.out.println("系统最大可用空间: "+ convertBytesToM(runtime.maxMemory()));
    6. // 返回 java 虚拟机的总共内存量。这个值将会随着时间变化,具体取决于主机环境。
    7. System.out.println("系统总共内存量: "+ convertBytesToM(runtime.totalMemory()));
    8. // 返回java虚拟机可用的内存容量。可以调用 gc 方法来增加 freeMemory
    9. System.out.println("系统可用内存量:"+ convertBytesToM(runtime.freeMemory()));
    10. }
    11. privatestaticlong convertBytesToM(long bytes){
    12. return bytes/1024/1024;
    13. }
    14. }

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

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

      代码如下:

    1. publicclassTest{
    2. publicstaticvoid main(String[] args){
    3. Runtime runtime =Runtime.getRuntime();
    4. // 返回 java 虚拟机将会尝试去获取的最大内存容量
    5. System.out.println("1.系统最大可用空间: "+ convertBytesToM(runtime.maxMemory())+" MB");
    6. // 返回 java 虚拟机的总共内存量。这个值将会随着时间变化,具体取决于主机环境。
    7. System.out.println("1.系统总共内存量: "+ convertBytesToM(runtime.totalMemory())+" MB");
    8. // 返回java虚拟机可用的内存容量。可以调用 gc 方法来增加 freeMemory
    9. System.out.println("1.系统可用内存量:"+ convertBytesToM(runtime.freeMemory())+" MB");
    10. System.out.println("-----------------------------------------------------------");
    11. String garbageStr ="";
    12. for(int i =0; i <20000; i++){
    13. garbageStr += i;
    14. }
    15. System.out.println("2.系统最大可用空间: "+ convertBytesToM(runtime.maxMemory())+" MB");
    16. System.out.println("2.系统总共内存量: "+ convertBytesToM(runtime.totalMemory())+" MB");
    17. System.out.println("2.系统可用内存量:"+ convertBytesToM(runtime.freeMemory())+" MB");
    18. System.out.println("-----------------------------------------------------------");
    19. runtime.gc();
    20. System.out.println("3.系统最大可用空间: "+ convertBytesToM(runtime.maxMemory())+" MB");
    21. System.out.println("3.系统总共内存量: "+ convertBytesToM(runtime.totalMemory())+" MB");
    22. System.out.println("3.系统可用内存量:"+ convertBytesToM(runtime.freeMemory())+" MB");
    23. }
    24. privatestaticlong convertBytesToM(long bytes){
    25. return bytes/1024/1024;
    26. }
    27. }

      结果如下显示:

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





  • 相关阅读:
    linux服务器上无root权限如何安装nodejs?
    Jupyter按tab键无法补全,而且报错TypeError: __init__() got an unexpected keyword argument 'column'的解决办法
    通过损失函数优化提高训练速度、准确性和数据利用率
    华为诺亚AutoML框架-Vega:(2) 代码结构
    华为诺亚实验室AutoML框架-Vega:(1) 介绍
    AutoML: A survey of the state-of-the-art综述期刊论文免费下载
    安装Docker 图形界面管理工具 -- Portainer
    Dockfile 编写示例(将 jar 制作成容器)
    Docker 常用命令集
    云服务器CentOS安装Docker
  • 原文地址:https://www.cnblogs.com/archy2016/p/7400102.html
Copyright © 2011-2022 走看看