了解Runtime类
在每一个Java 进程之中都会存在一个Runtime类对象,由于此类的对象是由Java进程自己维护的,所以在整个Runtime类设计的过程中,只为用户提供唯一的一个实例化对象,所以这个类所使用的就是单例设计模式,构造方法被私有化了。(如果是单例设计模式,构造方法被私有化,其内部也会有一个方法能够取得当前的实例对象),所以其类的内部一定会提供一个static方法取得本类的实例化对象。
例如:取得我们Runtime类对象: public static Runtime getRuntime()
那么获取对象之后我们可以做什么呢? 在Runtime类中定义有如下可以去的内存大小的方法:
- 空闲内存大小: public long freelMemory()
- 总共可用内存大小:public long totalMemory()
- 最大可用内存大小:public long maxMemory()
范例:取得内存大小
package dev;
public class test1 {
public static void main(String[] args) {
Runtime n=Runtime.getRuntime();
System.out.println(n.freeMemory());
System.out.println(n.maxMemory());
System.out.println(n.totalMemory());
}
}
输出结果:(这些都是字节,真正的resule=resule/1024/1024)
FREE = 15528232 (15M)
MAX = 259522560 (248M)
TOTAL = 16252928 (16M)
面试题:Java如何调整可用内存的大小?
扩展:JVM内存划分图
Java中内存划分主要有两个组成部分:
堆内存:保存的实例化对象的内容,在每个JVM进程中之中,对象的对内存都会由垃圾收集器自动的管理内存回收问题。
非堆内存:(Eden + Front Space + To Space):主要用于产生新的对象:
|- 所有的方法全局方法区
|- 所有的 static 的全局数据区
|- 永生代:负责存放反射对象的操作空间;
如果我们要调整我们的内存大小,只能调我们的堆内存空间,他的调整有如下三个参数:
"-Xms" : 初始分配大小,为物理内存的1/64,最多不超过1G;
"-Xmx" : 最大分配内存,为物理内存的1/4;
"-Xmm" : 年轻代内存大小;
在Runtime 类中提供有垃圾的收集机制:public void gc()
问题:那么垃圾处理经历了哪些问题呢?
简单的说:
1、新的对象保存在Eden 区中,之后的此对象保存在年轻代区;而后在进行GC之后所有被保存下来的年轻代中的对象(从GC,MinorGC),将保存在旧生带(主GC,MajorGC)。
2、如果再有新的对象,从年轻代回收,再找旧生代,最后都没空间,进行垃圾的全部所描(Full GC)。
面试题:请问什么是GC 如何操作?
GC 指的是垃圾收集,对于GC操作可以利用Runtime类中的gc()方法手工释放,或者是利用系统自动进行释放来进行垃圾回收处理;
总结:
1、Runtime 使用了单例设计模式,每一个JVM进程只会存在有一个Runtime类对象。
2、Runtime 类提供有gc()方法,可以进行垃圾收集处理。