技术与人生Java虚拟机

2.JVM的分代模型及对象流动

2019-08-04  本文已影响0人  进读万卷书
1.为什么JVM要分代?
public class MemoryAol {

    public static void main(String[] args) throws InterruptedException {
        while (true) {
            loadUsers();
            Thread.sleep(1000);
        }
    }
    
    private static void loadUsers() {
        UserUtil userUtil = new UserUtil();
        userUtil.loadUsers();
    }
}
1-8.png

如上所示的代码,main方法一直在运行,UserUtil对象会一直创建,但是当loadUsers执行完毕会进行出栈,此时年轻代堆里的刚创建的对象就没人引用了,这种对象当内存不足时是要被回收的,所以他们的存活周期很短。

public class MemoryAol {
    private static UserUtil userUtil = new UserUtil();
    public static void main(String[] args) throws InterruptedException {
        while (true) {
            loadUsers();
            Thread.sleep(1000);
        }
    }

    private static void loadUsers() {
        userUtil.loadUsers();
    }
}
1-9.png

如上代码,同样的,main方法一直在运行,不断地执行loadUsers,然后loadUsers又使用到userUtil,但这次不是局部变量,而是类的静态变量,引在存放在方法区,所以即使loadUsers方法不断地进栈出栈也不会对userUtil进行回收。随着程序不断运行,当它达到一定条件就会晋升到老年代,这时候这种对象成为了长期存活的对象了。

2.JVM是如何分代的?

JVM主要有如下三个分代:

3.什么时候触发新生代垃圾回收,永久代什么情况下会被回收?
4.对象在JVM是怎么分配和流动的?
5.JVM的参数设置
参数 例子 描述
-Xms -Xms2048m java堆内存大小
-Xmx -Xmx2048m java最大堆内存大小,一般情况下和上面的设置一样
-Xmn -Xmn1024m 年轻代内存大小,扣除年轻代剩下的堆内存就是年老代的
-XX:PermSize -XX:PermSize=256m 永久代(方法区)内存大小
-XX:MaxPermSize -XX:MaxPermSize=256m 永久代最大内存大小
-Xss -Xss1m 每个线程栈的内存大小

画个图更加具体一些,如下图:

1-7.jpg
上一篇下一篇

猜你喜欢

热点阅读