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

JVM系列

1.JVM运行机制的整体脉络
2.JVM的分代模型及对象流动
3.常见的垃圾回收器及算法
4.ParNew和CMS的工作原理

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主要有如下三个分代:

  • 年轻代
    年轻代对象主要的特点是存活周期短,回收频率高,回收速度快,年轻代还分为Eden区,Survivor1区,Survivor2区,三者默认比例8:1:1。
  • 年老代
    年老代对象主要特点是存活周期长,回收频率低,回收速度慢,尽量减少老年代回收的频率及次数。
  • 永久代
    存放一些类信息及常量,当内存不足时同样也会进行回收,回收条件看下面。
3.什么时候触发新生代垃圾回收,永久代什么情况下会被回收?
  • 新生代的回收时机
    当新生代Eden区快满的时候(不足以存放新建对象)会触发新生代回收(minor GC),会有短暂的Stop the world。后续文章会详细说明回收机制,采用什么算法及垃圾回收器,以及优缺点等。
  • 永久代回收时机
    当进行Full GC的时候,同时会检查并回收永久代内存。永久代内存回收需满足以下全部条件:
    1.该类的所有实例对象已经从JAVA堆内存里被回收。
    2.加载这个类的ClassLoader已经被回收了。
    3.该类的Class对象没有任何引用,比如User.class没有被引用。
4.对象在JVM是怎么分配和流动的?
  • 新建对象放哪
    新建对象放在年轻代的Eden区
  • 大对象怎么办
    大对象直接晋升老年代,通过-XX:PretenureSizeThreshold=<大小>,当大于设定大小的时候直接在老年代创建。
  • 什么时候从年轻代升到老年代
    每次发生minor gc,存活对象年龄加1,当年经代的对象年龄达到设置的大小,参数-XX:MaxTenuringThreshold设置,就会晋升到老年代。
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容