栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java内存分配具体分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java内存分配具体分析

对象内存分配流程图

验证对象是否栈上分配

public class AllotOnStack {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            alloc();
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

    private static void alloc() {
        User user = new User();
        user.setNum(1);
        user.setUuid("lcf");
    }
}


对象在堆内存的分配的情况

通过下图可以看到类在运行过程中,会将对象存在eden区,eden区在内存未满的情况下,并不会进行minor gc。图中eden区内存占用了87%

下图中可以看到,在eden区未满的情况下,新进来的对选哪个会持续向eden区加入对象。

下图因为eden区满了之后,Eden区没有足够空间进行分配时,虚拟机将发起一次MinorGC,GC期间虚拟机又发现allocation2无法存入Survior空间,所以只好把新生代的对象提前转移到老年代中去,老年代上的空间足够存放allocation2,所以不会出现FullGC。

下图执行MinorGC后,后面分配的对象如果能够存在eden区的话,还是会在eden区分配内存。 将存活的对象分别移动到survivor和老年代。

下图通过设置jvm参数-XX:PretenureSizeThreshold=1000000 (单位是字节) -XX:+UseSerialGC,可以使大于1000000 字节的对象直接进入老年代。
好处是可以使存活在年期带的大对象不需要在eden和survivor来回移动进行gc,从而消耗性能。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/988017.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号