java面试之_内存模型

1.所谓的内存模型
看你是否知道Java的内存划分
看你是否有过具体的工作经验, 因为在实际的开发中, 如果不调整内存, 那么性能将会造成极大的浪费
关于GC的解释操作

如果要是说到内存, 可能最直观的理解就在于Runtime类中, 那么这个类就采用了单例设计模式, 这个类之中提供了内存信息的取得, 以及系统的垃圾搜集处理操作

获取Runtime的默认值:

public class TestRuntime {
public static void main(String [] args)
{
Runtime run = Runtime.getRuntime(); //取得Runtime类的对象
System.out.println("MAX_MEMORY = " + run.maxMemory());
System.out.println("TOTAL_MEMORY = " + run.totalMemory());
System.out.println("FREE_MEMORY = " + run.freeMemory());
}
}

结果:

MAX_MEMORY = 932184064 相当于889M, 最大的承受能力
TOTAL_MEMORY = 64487424 相当于61.5M, 常用的内存空间的大小
FREE_MEMORY = 62440328 相当于59.547M, 牵扯到一些系统的初始化操作, 会占用一些内存空间

这三个方法的返回值是long字节类型, 所以它返回的是字节型
实际上在Javva中, 如果想要进行内存的变更, 就需要掌握以下内存的结构(内存模型)

在Java里面, 对于内存的空间, 可以划分成如下几点
伊甸园区: 新生的对象都保存在此处, 但是不一定这些新生的对象会一直存活
此处也属于内存空间, 那么既然是内存空间, 一定会被占满, 如果占满了, 则执行GC处理
Runtime类中具备GC

旧生代区:如果对象发现其要一直使用, 那么就将进入到旧声带去, 这属于耳机回收保险
        如果要是先执行GC, 那么坑定先清理伊甸园去, 随后如果发现空间不足, 继续清理旧生代区
永久区:永久区中的数据不会清楚, 方法也在方法区中, 即使程序出现了"OutOfMemoryError"也不会清除

直观的观察内存:

import java.util.Date;

public class TestRuntime {
public static void main(String [] args)
{
Runtime run = Runtime.getRuntime(); //取得Runtime类的对象
System.out.println("1.MAX_MEMORY = " + run.maxMemory());
System.out.println("1.TOTAL_MEMORY = " + run.totalMemory());
System.out.println("1.FREE_MEMORY = " + run.freeMemory());

    System.out.println("****************************************");


    String str = "";
    for(int x=0; x< 100000; x++)
    {
        str += "";
        new Date();
    }


    str = null;     //产生了垃圾
    System.out.println("2.MAX_MEMORY = " + run.maxMemory());
    System.out.println("2.TOTAL_MEMORY = " + run.totalMemory());
    System.out.println("2.FREE_MEMORY = " + run.freeMemory());


    run.gc();       //进行垃圾回收处理


    System.out.println("3.MAX_MEMORY = " + run.maxMemory());
    System.out.println("3.TOTAL_MEMORY = " + run.totalMemory());
    System.out.println("3.FREE_MEMORY = " + run.freeMemory());




}

}

调整内存大小: 也就是调整堆栈的大小
在VM options中调整:
-Xms2048M -Xmx2048M -Xmn1024M
初始化内存空间: 2个G, 最大分配空间2个G 设置新的空间1个G

运行案例:

Runtime run = Runtime.getRuntime(); //取得Runtime类的对象
System.out.println("1.MAX_MEMORY = " + run.maxMemory());
System.out.println("1.TOTAL_MEMORY = " + run.totalMemory());
System.out.println("1.FREE_MEMORY = " + run.freeMemory());

结果:
1.MAX_MEMORY = 2013265920
1.TOTAL_MEMORY = 2013265920
1.FREE_MEMORY = 1964947496

只有调整之后, 才课题保证系统内存会得到提升, 这样很明显, 你可以发挥出你电脑的性能, 因为默认大小是电脑内存的1/4大小, 同时不超过1个G,

-Xms: 初始分配的内存大小, 默认为物理内存的64分之1, 小于1G
-Xmx: 最大分配内存, 默认大小为物理内存的1/4, 小于1G
-Xmn: 设置年轻代(伊甸园区)的堆内存的大小
Mavean也可以通过设置内存参数的大小来提高编译的速度

发布了3 篇原创文章 · 获赞 0 · 访问量 145

猜你喜欢

转载自blog.csdn.net/weixin_42694727/article/details/105591346