Runtime类(Java JVM的分析)

      在每一个java进程之中都会存在有一个Runtime类的对象。由于此类的对象是由Java进程自己维护,所以在整个Runtime类设计的过程之中,只为用户提供了唯一的一个实例化对象。所以这个类所使用的就是单例设计模式,构造方法被私有化了。所以其类的内部一定会提供有一个static方法取得本类的实例化对象。

        取得Runtime类对象:public static Runtime getRuntime()

那么取得对象之后可以做什么呢?在Runtime类中定义有如下可以取得内存大小的方法。

        最大可用内存大小:public long maxMemory()
    总共可用内存大小:public long totalMemory()
    空闲内存大小:public long freeMemory()
范例:取得内存空间大小
package com.lohas.demo.runtime;
public class RuntimeDemo {
    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();//取得Runtime类的实例化对象
        System.out.println("freeMemory: " + runtime.freeMemory() + ",单位(M:" + runtime.freeMemory()/1024/1024);
        System.out.println("totalMemory: " + runtime.totalMemory() + ",单位(M:" + runtime.totalMemory()/1024/1024);
        System.out.println("maxMemory: " + runtime.maxMemory() + ",单位(M:" + runtime.maxMemory()/1024/1024);
    }
}
运行的结果: 

freeMemory:125566400,单位(M):119

totalMemory:128974848,单位(M):123

maxMemory:1892155392,单位(M):1804

 

Java如何调整可用内存大小?

Runtime类(Java JVM的分析)

Java中的内存划分主要有两个组成部分:

堆内存:保存的实例化对象的内容,在每一个JVM进程之中,对象的堆内存空间都会由垃圾收集器自动管理内存回收问题。

非堆内存(Eden+Front Space+To Space):主要用于产生新的对象,

-所有方法的全局方法区

-所有的static的全局数据区

-永生代:负责存放反射对象的操作空间


如果要想调整内存大小主要调整的就是堆内存空间,它的调整有如下三个参数:

“-Xms”: 初始分配大小,为物理内存的1/64,最多不超过1G。

“-Xmx”: 最大分配内存,为物理内存的1/4。

“-Xmn”: 年轻代堆内存大小。

java -Xms1024M -Xmx1024M -Xmn512M RuntimeDemo

 

在Runtime类中提供有垃圾的收集机制:public void gc()。

范例:垃圾回收

package com.lohas.demo.runtime;

public class RuntimeDemo {

    public static void main(String[] args) {

        Runtime runtime =Runtime.getRuntime();//取得Runtime类的实例化对象

        System.out.println("freeMemory:" + runtime.freeMemory() + ",单位(M):" +runtime.freeMemory()/1024/1024);

        System.out.println("totalMemory:" + runtime.totalMemory() + ",单位(M):" +runtime.totalMemory()/1024/1024);

        System.out.println("maxMemory:" + runtime.maxMemory() + ",单位(M):" +runtime.maxMemory()/1024/1024);

        String str = "";

        for (int i = 0; i < 3000; i++) {

            str += i;

        }

        System.out.println("----生产对象后的内存---");

        System.out.println("freeMemory:" + runtime.freeMemory() + ",单位(M):" +runtime.freeMemory()/1024/1024);

        System.out.println("totalMemory:" + runtime.totalMemory() + ",单位(M):" +runtime.totalMemory()/1024/1024);

        System.out.println("maxMemory:" + runtime.maxMemory() + ",单位(M):" +runtime.maxMemory()/1024/1024);

        runtime.gc();

        System.out.println("----垃圾回收后的内存---");

        System.out.println("freeMemory:" + runtime.freeMemory() + ",单位(M):" +runtime.freeMemory()/1024/1024);

        System.out.println("totalMemory:" + runtime.totalMemory() + ",单位(M):" +runtime.totalMemory()/1024/1024);

        System.out.println("maxMemory:" + runtime.maxMemory() + ",单位(M):" +runtime.maxMemory()/1024/1024);

    }

}

 

运行结果:

freeMemory: 125566400,单位(M):119

totalMemory: 128974848,单位(M):123

maxMemory: 1892155392,单位(M):1804

----生产对象后的内存---

freeMemory: 103591376,单位(M):98

totalMemory: 128974848,单位(M):123

maxMemory: 1892155392,单位(M):1804

----垃圾回收后的内存---

freeMemory: 161033784,单位(M):153

totalMemory: 163053568,单位(M):155

maxMemory: 1892155392,单位(M):1804

 

JVM垃圾回收流程:

 Runtime类(Java JVM的分析)

简单点来说:

新的对象保存在Eden区中,之后此对象保存在年轻代区,而后在进行GC之后所有被保留下的年轻代中的对象(从GC、MinorGC),将保存在旧生代(主GC,MajorGC)。

如果再有新的对象,从年轻代回收,再找到旧生代回收,最后都没空间,进行垃圾的全部扫描(FullGC)。


请问什么是GC如何操作?

GC指的是垃圾收集,对于GC操作可以利用Runtime类中的gc()方法手工释放,或者是利用系统自动进行释放。

总结:Runtime使用了单例设计模式,每一个JVM进程只会存在一个Runtime类对象。

Runtime类提供有gc()方法,可以进行垃圾收集处理。