java中Runtime类总结_Jacky_Cmd的博客-程序员秘密

技术标签: jvm  Runtime  java  单例设计模式  Java学习笔记  

一.了解Runtime类

Runtime:运行时,是一个封装了JVM的类。每一个JAVA程序实际上都是启动了一个JVM进程,每一个JVM进程都对应一个Runtime实例,此实例是由JVM为其实例化的。所以我们不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。
查看官方文档可以看到,Runtime类中没有构造方法,本类的构造方法被私有化了, 所以才会有getRuntime方法返回本来的实例化对象,这与单例设计模式不谋而合
public static Runtime getRuntime()

直接使用此静态方法可以取得Runtime类的实例
Runtime类的常用方法


二.使用Runtime获取JVM的空间信息

1.得到JVM信息
每一个Runtime对象都是JVM实例化的,所以可以通过Runtime类取得相关信息

public class RuntimeDemo01{
	public static void main(String[] args){
		Runtime run = Runtime.getRuntime();	//通过Runtime类的静态方法获取Runtime类的实例
		System.out.println("JVM最大内存量:"+run.maxMemory());
		System.out.println("JVM空闲内存量:"+run.freeMemory());
	}
}


验证->频繁改变String类字符串引用造成内存浪费,产生大量垃圾:

public class RuntimeDemo01{
	public static void main(String[] args){
		Runtime run = Runtime.getRuntime();	//通过Runtime类的静态方法获取Runtime类的实例
		System.out.println("JVM最大内存量:"+run.maxMemory());
		System.out.println("JVM空闲内存量:"+run.freeMemory());
		String str = "Hello"+"World";
		System.out.println(str);
		for(int i=0;i<2000;i++){
			str = str + i;
		}
		System.out.println("JVM空闲内存量:"+run.freeMemory());
	}
}

使用StringBuffer类实现同样效果,看一下内存使用情况:

public class RuntimeDemo02{
	public static void main(String[] args){
		Runtime run = Runtime.getRuntime();	//通过Runtime类的静态方法获取Runtime类的实例
		System.out.println("JVM最大内存量:"+run.maxMemory());
		System.out.println("JVM空闲内存量:"+run.freeMemory());
		StringBuffer buf = new StringBuffer();
		buf.append("Hello").append("World");
		System.out.println(buf);
		for(int i=0;i<2000;i++){
			buf.append(i);
		}
		System.out.println("JVM空闲内存量:"+run.freeMemory());
	}
}


可以看到利用StringBuffer实现并未产生垃圾,节省了空间。既然使用String类改变字符串引用产生大量的垃圾,则需要进行垃圾处理,释放空间

2.JVM垃圾回收

public void gc()

public class RuntimeDemo01{
	public static void main(String[] args){
		Runtime run = Runtime.getRuntime();	//通过Runtime类的静态方法获取Runtime类的实例
		System.out.println("JVM最大内存量:"+run.maxMemory());
		System.out.println("JVM空闲内存量:"+run.freeMemory());
		String str = "Hello"+"World";
		System.out.println(str);
		for(int i=0;i<2000;i++){
			str = str + i;
		}
		System.out.println("操作String之后的JVM空闲内存量:"+run.freeMemory());
		run.gc();
		System.out.println("垃圾回收之后的JVM空闲内存量:"+run.freeMemory());
	}
}

三.Runtime类与Process类

除了观察内存使用量之外,还可以直接使用Runtime类运行本机的可执行程序。

public Process exec(String command)throwsIOException

例如:调用记事本:

public class RuntimeDemo03{
	public static void main(String[] args){
		Runtime run = Runtime.getRuntime();	//通过Runtime类的静态方法获取Runtime类的实例
		try{
			run.exec("notepad.exe");	//调用本机程序,此方法需要进行异常处理
		}catch(Exception e){
			e.printStackTrace();
		}		
	}
}

exec()方法的返回值是Process类,Process类也有一些方法可以使用,比如结束一个进程,通过destroy()结束
注意:Runtime类本身就是单例设计模式的一种应用,因为整个JVM中只存在一个Runtime类的对象,可以使用Runtime类取得JVM的系统信息,或者使用gc()方法释放掉垃圾空间,还可以运行本机的程序


















版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tomcmd/article/details/48971051

智能推荐

二进制安全_I_am_busy的博客-程序员秘密

刚开始学二进制,虽然高中时候知道二进制是个啥,什么逢二进一也懂,但是完全不知道二进制跟电脑有啥关系,更别说那些专业名词了,这两天看到一篇大佬的文章,怎么说呢,写的不错,对小白非常友好,大佬的链接放下边了。Jeffersli还有一篇文章讲述的是关于二进制安全是个啥有啥用,也是一位博主,本着分享与方便自己日后查看的原则我就直接复制粘贴一手吧,那位博主的这篇文章也是转载的,应该不涉及侵权什么的博主的链接我也放下边了方便以后找大佬链接转自某推文,链接找不到了。一.什么是二进制安全在很久以前安全圈并没

vue 随机生成uuid_vue随机生成uuid_冉茉莉的博客-程序员秘密

1、安装npm install uuid2、在需要使用的页面引入入口文件import { uuid } from 'vue-uuid'; 3、最后就是使用了localStorage.setItem('uuid',uuid.v1()) 直接取uuid.v1 就OK了

西安80坐标系转换工具_tangshenq17565的博客-程序员秘密

西安80坐标系转换工具                利用ARCGIS进行自定义坐标系和投影转换                ARCGIS种通过三参数和其参数进行精确投影转换     注意:投影转换成80坐标系需要下载无偏移卫星图像进行转换,有偏移的转换将导致转换后的卫星图像扭曲,坐标错误,无法配准。     第一步:选择无偏移地图源,下载

Unity使用脚本更换物体材质球_unity c#脚本替换材质球_homic的博客-程序员秘密

ㅤㅤㅤ思路:获取物品Mesh Render下的Materials,进行一层或者多层的替换代码(按A,B切换材质球):using UnityEngine;public class SwitchMaterial : MonoBehaviour{ public Material Mat1, Mat2; // 贴图 void Update() { if (Input....

枚举类_-梁小迪的博客-程序员秘密

枚举类:类的对象的个数是可数多个的这样的类叫作枚举类1.自定义枚举类2.使用enum实现枚举3.enum类中常见方法4.实现接口的枚举类快捷键:ctrl + shift + x:将所有字母变成大写ctrl + shift + y:将所有字母变成小写通过使用enum关键字创建枚举类型格式:enum 枚举类的类名{}说明:1.声明的对象必须放在首行,多个对象之间用","分开 ";"结尾2.构造器默认就是私有的也只能是private3.

[操作系统] 操作系统概述_lixin051435的博客-程序员秘密

一、操作系统概述操作系统是一款系统软件,方便用户管理和控制计算机软硬件资源的程序集合。从一般用户的角度看,操作系统时用户与计算机硬件系统之间的接口,用户可通过命令、系统调用、图形等方式使用计算机;从资源管理的角度看,操作系统时计算机系统资源的管理者,在一个计算机系统中,资源可分为处理器、存储器、IO设备和信息四类,相应的,操作系统也针对这四类资源进行有效管理:处理机管理,分配和控制处理机;...

随便推点

git fetch和git pull的区别_高频git面试题_weixin_39755824的博客-程序员秘密

ssh keygen: 生成非对称加密中的 public-key 与 private-key,并把 public-key 扔到 github 上。详情上篇文章 安大虎:服务器基本配置github新建repository与本地仓库与云仓库的版本管理gitignore失效解决方法git commit 时出现的问题及解决方法git rm 与 rm的区别常用git命令整理cherry-pick的使用git...

python用选择法排序-Python 冒泡排序和选择法排序_weixin_40008135的博客-程序员秘密

1,冒泡排序from random import randint#定义一个函数def paixu(lst):#接收传进来的列表的长度length = len(lst)for i in range(0, length): #迭代的次数是列表的长度for j in range(0, length-i-1): #迭代的次数是列表长度减去已经冒泡的元素个数减1(减1是为了第j个和j+1个比较)if lst...

转:如何求出grid图像每个cell对应的x,y坐标?_weixin_30270561的博客-程序员秘密

现有一个grid文件,现有三个字段,id,value,count。新建二个字段x,y,如何求出每个cell的坐标值,并输入到grid的属性表中的x,y字段中。另外,如何将grid转为一个一个cell小格的polygon feature,我在空间分析模块下试了一下,转出来的polygon不是一个一个cell小格图形,它把value值相同并相邻的cell合成一个polygon,并且在grid网格的边...

我为什么离开德国顶级传统大厂IT部_湾区人工智能的博客-程序员秘密

开发点击欧盟IT那些事关注我们公告:因企鹅审核规定,本公众号从《德国IT那些事》更名为《欧盟IT那些事》。四年,我轻轻地走了,正如我轻轻的来。作者 | 立斯编辑 | 欧事君因某些不可描...

个人测试阿里大于短信接口添加签名_beAwesomeToday的博客-程序员秘密

添加签名的时候签名名称需要写作XX商城,这样才会被审核通过。

iOS使用TestFlight测试你的App(内部测试)_Ahao_plus的博客-程序员秘密

使用苹果测试工具TestFlight进行上线前的测试

推荐文章

热门文章

相关标签