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

最近在网上看到一些人讨论到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()可 能会有些大。

自己写了个例子,对着测试 结果应该会有更深刻的了解:

 

[java] view plaincopy
  1. package com.trs.tb.encrypt;  
  2.   
  3. public class TestMemory {  
  4.     public static void main(String[] args) {  
  5.         System.out.println("free:" + Runtime.getRuntime().freeMemory() / 1024  
  6.                 / 1024);  
  7.         System.out.println("total:" + Runtime.getRuntime().totalMemory() / 1024  
  8.                 / 1024);  
  9.         System.out.println("max:" + Runtime.getRuntime().maxMemory() / 1024  
  10.                 / 1024);  
  11.         System.out.println("=============");  
  12.         long t = System.currentTimeMillis();  
  13.         try {  
  14.             Thread.sleep(3000);  
  15.         } catch (Exception ee) {  
  16.             ee.printStackTrace();  
  17.         }  
  18.         String[] aaa = new String[2000000];  
  19.         System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024);  
  20.         System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);  
  21.         System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024);  
  22.         System.out.println("=============");  
  23.         try {  
  24.             Thread.sleep(3000);  
  25.         } catch (Exception ee) {  
  26.             ee.printStackTrace();  
  27.         }  
  28.         for (int i = 0; i < 2000000; i++) {  
  29.             aaa[i] = new String("aaa");  
  30.         }  
  31.         System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024);  
  32.         System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);  
  33.         System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024);  
  34.         System.out.println("=============");  
  35.         try {  
  36.             Thread.sleep(30000);  
  37.         } catch (Exception ee) {  
  38.             ee.printStackTrace();  
  39.         }  
  40.     }  
  41. }  


执行时间

 

free:4
total:4
max:63
=============
4
12
63
=============
9
63
63
=============

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于 lockfree 算法

lockfree的本质是乐观锁。也就是说&#xff0c;它假设多数情况下&#xff0c;别人不会改变。一个通用的lockfree算法可描述如下&#xff1a; lockfree_modify(DataT* data){ for (;;) { Save old state of data to a local variable; do modify; lo…

枚举类enum

一、枚举类 package com.xxx.xf.common.enums;import com.xxx.xf.workday.contant.HolidayContant;/*** Author: wangmq* Version: 1.0* 操作枚举类*/ public enum XfOperateEnum {// 定义多个由构造方法组成的对象&#xff0c;逗号隔开分号为结束XF_OPERATE_SL("SL"…

js怎么调用wasm_Long.js源码解析

基于现在市面上到处都是 Vue/React 之类的源码分析文章实在是太多了。(虽然我也写过 Vite的源码解析所以这次来写点不一样的。由于微信这边用的是 protobuf 来进行 rpc 调用。所以有时候需要将 JS 中的 Number 类型转换为 Long 类型传给后端。目前用的最多的就是 Long.js 了&am…

设置UILabel可变高度(根据文本内容自动适应高度)

property(nonatomic)UILabel *showLabel;// 计算文本所占高度&#xff0c;计算出来之后设置label的高度// 第一个参数&#xff1a;字体大小&#xff0c;字体大小/样式影响计算字体的高度 // 第二个参数&#xff1a;CGSize结构体&#xff0c;结构体中第一个参数表示宽度&#xf…

励志英语谚语【二】

• All things in their being are good for something. • 天生我才必有用。 • Difficult circumstances serve as a textbook of life for people. • 困难坎坷是人们的生活教科书。 • Failure is the mother of success. -- Thomas Paine • 失败乃成功之母。 • For m…

AOP快速入门

一、概念 AOP面向切面编程&#xff0c;是函数式编程的延申&#xff0c;是对OOP的补充&#xff1b; 代理模式&#xff1a;拦截增强作用&#xff0c;增强功能&#xff1b; 1、java继承&#xff0c;纵向共性抽取&#xff0c; 2、横向切面AOP织入增强代码方式 二、原理是通过代理机…

图形大小_PS图形复制——等距复制、旋转复制、大小变换复制

PS中图形复制是很常见的事&#xff0c;可能不同人的习惯可能会用不同的方法。这里糖糖主要讲的是图形的一些等距复制、旋转复制、大小变换旋转复制&#xff0c;相信看过本篇文章之后你也可以通过图形的不同需要的复制做一些很不错的图案哦~糖糖先在PS里用钢笔工具绘制了一个绿叶…

在页面制作过程中需要注意事项

&#xff08;1&#xff09;静态页面.将信息页面和频道、网站首页改成静态页面&#xff0c;有利于搜索引擎更快更好地收录 &#xff08;2&#xff09;页面标题的关键词优化。必须列出信息的标题、网站的名称以及相关关键字 &#xff08;3&#xff09;<meta>标签优化。通过…

python 自动补全

cd ~/.vim/bundle git clone https://github.com/rkulla/pydiction.git cp -r pydiction/after ~/.vim转载于:https://blog.51cto.com/curran/1710868

net命令详解

许多 Windows NT 网络命令以 net 开始。这些 net 命令有一些公共属性&#xff1a; -通过键入 net /? 可查阅所有可用的 net 命令。 -通过键入 net help 命令可在命令行中获得 net 命令的语法帮助。 例如&#xff0c;要得到 net accounts 命令的帮助&#xff0c;请键入 net he…

AOP联盟通知类型和Spring编写代理半自动

一、cglib功能更强大 二、Spring核心jar包 三、AOP联盟通知 三、代码实现Spring半自动代理 1、环绕通知的切面 2、bean.xml配置 3、创建bean容器&#xff0c;获取bean&#xff0c;即已经创建好的代理对象&#xff1a; 4、配置多个接口 转载于:https://www.cnblogs.com/wmqiang/…

1到30图片大全顺序_终于解决了!自媒体作者,如何给 Word 中的图片批量编号?...

今天这个技巧非常有用&#xff0c;特别是对小编这种每天都要写图文教程的人来说&#xff0c;简直是续命神技。如果 Word 中有大量的图片&#xff0c;经常需要个每个图片顺序编号&#xff0c;有没有同款需求&#xff1f;大家平时都一个个手工输入的吗&#xff1f;编到后来很可能…

[状态压缩DP] COJ 1129 送货到家

第一道状态压缩DP&#xff1b; 这道题要求一个无向图的最小权回路&#xff0c;要求经过所有点&#xff0c;所以可以任选一个点&#xff08;这里选0&#xff09;作为起点&#xff0c;以后的状态f[s, i]表示从0出发到i结束的最小权路径&#xff0c;最终求得f[1<<n-1, k]后要…

模式8--WorkerThread

来至《java多线程设计模式》 类似ThreadPool&#xff0c;预先产生几个worker线程准备工作。 public void startWorkers() {for (int i 0; i < threadPool.length; i) {threadPool[i].start();}} package Sample;public class WorkerThread extends Thread {private final C…

Android Volley框架的使用(二)

此博文源码下载地址 https://github.com/Javen205/VolleyDemo.git 使用请求队列RequestQueue Volley中的Request都需要添加到RequestQueue中才能执行&#xff0c;所以首先需要创建一个RequestQueue RequestQueue Volley.newRequestQueue(mContext); 通常情况在一个应用中需要…

Spring全自动AOP和项目加入jar包

一、jar可以引进项目中&#xff0c;复制到路下后&#xff0c;要add as library&#xff0c;加载到工作空间中才能引入&#xff1b; 也jar包放在硬盘的项目目录外面&#xff0c;可以多个项目引入共用&#xff1a; 二、xml配置 1、aop全自动配置 2、xml装配bean,不是注解方式 3、…

迭代器和yield

2012-08-05©tc庄稼汉 迭代器是一种方法、get 访问器或运算符&#xff0c;它通过使用 yield 关键字对数组或集合类执行自定义迭代。 yield 返回语句会导致源序列中的元素在访问源序列中的下一个元素之前立即返回给调用方。 尽管您以方法的形式编写迭代器&#xff0c;但编译…

中怎样载入选区_ps中快捷大全

使用ps时使用快捷键更方便&#xff0c;操作起来更能提高工作效率&#xff0c;下面给大家总结一下&#xff0c;希望对大家有帮助&#xff0c;当然大家有更好的技巧可以来魔课66网一起交流一下文件设置:Ctrln——新建Ctrlo——打开Ctrlp——打印Ctrls—— 存储Ctrlw——关闭Ctrl …

AspectJ——AOP框架快速入门

一、导包 二、bean.xml配置 三、环绕通知 四&#xff0c;表达式 转载于:https://www.cnblogs.com/wmqiang/p/11617042.html

linux桌面环境应用

为什么80%的码农都做不了架构师&#xff1f;>>> 通常的 Linux 发行版都使用 KDE 或者 GNOME 作为默认的桌面环境。它们都给用户提供了一个原始的并且有吸引力的桌面&#xff0c;并且内置了各式各样的多媒体软件、系统程序、游戏、实用程序、网页开发工具、编程 工具…