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()可 能会有些大。 


把下面的源代码编译以后,在class文件所在的目录里面,分别用java -cp . Untitled1 和java -cp . -Xms80m -Xmx80m Untitled1 运行,看看结果如何,有助于理解上面的阐述。

    1. public class Untitled1 { 
    2. public Untitled1() {} 
    3. public static void main(String[] args) { 
    4. System.out.println(Runtime.getRuntime().freeMemory()); 
    5. System.out.println(Runtime.getRuntime().totalMemory()); 
    6. System.out.println(Runtime.getRuntime().maxMemory()); 
    7. long t = System.currentTimeMillis(); 
    8. try 
    9. Thread.sleep(30000); 
    10. catch (Exception ee) { 
    11. ee.printStackTrace(); 
    12. String[]?aaa?=?new?String[2000000]; 
    13. System.out.println(Runtime.getRuntime().freeMemory()); 
    14. System.out.println(Runtime.getRuntime().totalMemory()); 
    15. System.out.println(Runtime.getRuntime().maxMemory()); 
    16. try{
    17. Thread.sleep(30000);
    18. }catch (Exception ee){
    19. ee.printStackTrace();
    20. }
    21. for(int i=0;i<2000000;i++){
    22. aaa[i]=new?String("aaa");
    23. }
    24. System.out.println(Runtime.getRuntime().freeMemory());
    25. System.out.println(Runtime.getRuntime().totalMemory());
    26. System.out.println(Runtime.getRuntime().maxMemory());
    27. try{
    28. Thread.sleep(30000);
    29. }catch(Exception?ee){
    30. ee.printStackTrace();
    31. }
    32. }
    33. }

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/6347776.html,如需转载请自行联系原作者
相关文章
|
7月前
|
canal 编解码 运维
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
219 12
|
10月前
|
API 数据安全/隐私保护 开发者
实时获取小红书详情 API 数据
小红书详情API数据获取指南:注册开发者账号,创建应用并申请接口权限,构建请求获取笔记详情,使用Python等语言处理响应数据。需遵守使用规则,注意调用频率和数据安全。
|
编解码 前端开发 Android开发
Android经典实战之TextureView原理和高级用法
本文介绍了 `TextureView` 的原理和特点,包括其硬件加速渲染的优势及与其他视图叠加使用的灵活性,并提供了视频播放和自定义绘制的示例代码。通过合理管理生命周期和资源,`TextureView` 可实现高效流畅的图形和视频渲染。
747 12
|
10月前
|
缓存 监控 安全
检测 Webpack 5 持久化缓存是否存在安全漏洞
【10月更文挑战第23天】通过全面、系统地检测和评估,能够及时发现 Webpack 5 持久化缓存的安全漏洞,并采取有效的措施进行修复,保障项目的安全稳定运行。同时,要持续关注安全技术的发展和变化,不断提升安全检测能力,以应对日益复杂的安全挑战。
|
11月前
|
存储 Linux
linux echo 写入文件
通过这些技巧和示例,你可以灵活运用 `echo`命令,无论是进行简单的文本输出还是复杂的文件操作,都能在Linux环境中游刃有余。
417 1
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
1309 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
机器学习/深度学习 数据可视化 数据挖掘
R语言包管理:如何使用CRAN与Bioconductor
【8月更文挑战第28天】CRAN和Bioconductor是R语言包的两个重要来源,分别覆盖了广泛的科学计算和生物信息学领域。通过掌握CRAN和Bioconductor的包管理技巧,用户可以更加高效地利用R语言进行数据分析、统计建模和生物信息学研究。在实际应用中,建议根据具体需求选择合适的包,并合理设置镜像站点以提高下载速度。同时,定期更新和卸载不再需要的包,有助于保持R环境的整洁和高效。
|
XML 存储 网络安全
GIGE 协议摘录 —— GVCP 协议(二)(下)
GIGE 协议摘录 —— GVCP 协议(二)
597 3
|
弹性计算
阿里云服务器IP地址查询_公网IP和私有IP查看
阿里云服务器IP地址查询_公网IP和私有IP查看
726 0
|
存储 Cloud Native 关系型数据库
对话 | PolarDB for MySQL 云原生多主架构解读
PolarDB for MySQL多主架构集群版的发布,实现了集群架构从一写多读到多写多读升级,以及写性能的横向扩展,让用户购买的资源得到了最大化的利用。
对话 | PolarDB for MySQL 云原生多主架构解读