java基础类库——Runtime类的使用(二)

Runtime类的使用

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

取得Runtime类对象:public static Runtime getRuntime()
那么取得对象之后可以做什么呢?在Runtime类中定义有如下可以取得内存大小的方法:
(1)最大可用内存大小:public long maxMemory()
(2)总共可用内存大小:public long totalMemory()
(3)空闲内存大小:public long freeMemory()

范例:取得内存空间大小

package day2;

public class TestDemo {
    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();
        System.out.println("MAX = " + runtime.maxMemory());
        System.out.println("TOTLE = " + runtime.totalMemory());
        System.out.println("FREE = " + runtime.freeMemory());
    }
}
MAX = 1886912512(1799.5M)
TOTLE = 128974848(123M)
FREE = 126237632(120M)

面试题:java如何调整内存的大小?
在这里插入图片描述

java的内存划分主要有两个组成部分:
(1)堆内存:保存的实例化对象的内容,在每一个JVM进程之中,对象的堆内存空间都会由垃圾收集器自动的管理内存回收问题。
(2)非堆内存(Eden + Front Space +To Space):主要用于产生新的对象;
(2.1)所有方法的全局方法区:
(2.2)所有static的全局数据区:
(2.3)永生代:负责存放反射对象的操作空间;

如果要想调整内存大小主要调整的就是堆内存空间,它的调整有如下三个参数:
(1)-Xms:初始分配大小,为物理内存的1/64,最多不超过1G
(2)-Xmx:最大分配内存,为物理内存的1/4。
(3)-Xmn:年轻代堆内存大小,通过这个值也可以得到老生代的大小:-Xmx减去-Xmn

java -Xms1024M -Xmx1024M -Xmn512M TestDemo

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

范例:垃圾回收

package day2;

public class TestDemo {
    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();
        System.out.println("1.MAX = " + runtime.maxMemory());
        System.out.println("1.TOTLE = " + runtime.totalMemory());
        System.out.println("1.FREE = " + runtime.freeMemory());
        String str = "";
        for(int i= 0;i<3000;i++){
            str +=i;
        }
        System.out.println("\n2.MAX = " + runtime.maxMemory());
        System.out.println("2.TOTLE = " + runtime.totalMemory());
        System.out.println("2.FREE = " + runtime.freeMemory());

        runtime.gc();//垃圾回收
        System.out.println("\n3.MAX = " + runtime.maxMemory());
        System.out.println("3.TOTLE = " + runtime.totalMemory());
        System.out.println("3.FREE = " + runtime.freeMemory());
    }
}

1.MAX = 1886912512
1.TOTLE = 128974848
1.FREE = 126237632

2.MAX = 1886912512
2.TOTLE = 163053568
2.FREE = 103325272

3.MAX = 1886912512
3.TOTLE = 163053568
3.FREE = 161042496

那么回收到底经历了那些问题呢?
在这里插入图片描述
简单点说:
(1)新的对象保存在Eden中,之后此对象保存年轻代区,而后在进行GC之后所有被保留下来的年轻代中的对象(从GC、MinorGC),将保存在旧生代(主GC、majorGC)。
(2)如果再有新的对象,从年轻代回收,再找旧生代,最后都没有空间,进行全部垃圾扫描(Full GC)

面试题:请问什么事GC,如何操作?
(1)GC指的是垃圾收集,对于GC操作可以利用Runtime类中的gc()方法手工释放,或者是利用系统自动进行释放:
(2)新的对象保存在Eden中,之后此对象保存年轻代区,而后在进行GC之后所有被保留下来的年轻代中的对象(从GC、MinorGC),将保存在旧生代(主GC、majorGC)。
(3)如果再有新的对象,从年轻代回收,再找旧生代,最后都没有空间,进行全部垃圾扫描(Full GC)

总结:
(1)Runtime使用了单例设计模式,每一个JVM进程只会存在有一个Runtime类对象;
(2)Runtime类提供有gc()方法,可以进行垃圾收集处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值