温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
  • 忘记密码?
登录注册×
获取短信验证码
其他方式登录
点击 登录注册 即表示同意 《亿速云用户服务条款》
  • 服务器
  • 数据库
  • 开发技术
  • 网络安全
  • 互联网科技
登 录 注册有礼
最新更新 网站标签 地图导航
产品
  • 首页 > 
  • 教程 > 
  • 开发技术 > 
  • 编程语言 > 
  • JVM内存模型与运行时数据区域的案例分析

JVM内存模型与运行时数据区域的案例分析

发布时间:2020-10-26 10:32:57 来源:亿速云 阅读:177 作者:小新 栏目: 编程语言

这篇文章给大家分享的是有关JVM内存模型与运行时数据区域的案例分析的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

一、java内存模型

JVM内存模型与运行时数据区域的案例分析

java定义内存模型的目的是:为了屏蔽各种硬件和操作系统的内存访问之间的差异。

java内存模型规定了所有的变量都存储在主内存中,每条线程拥有自己的工作内存,工作内存保存了主内存中变量的副本。

线程对变量操作只能在工作内存中进行,不能直接读写主内存的变量。

不同线程之间的变量访问需要通过主内存来完成。

1、java内存模型和java运行时数据区域的关系:主内存对应着java堆,工作内存对应着java栈。

2、volatile关键字,使得变量的更新在各个工作内存中都是实时可见的。在DCL的单例模式中有运用到

二、java运行时数据区域/内存区域

因为jvm的运行时数据区域一直在改善,所以不同jdk版本之间会有不同。

1、jdk1.7之前的jvm内存区域,拥有永久代

JVM内存模型与运行时数据区域的案例分析

1、程序计数器的作用,因为.java文件被编译成.class文件,它作为当前线程所执行的字节码的行号指示器。当字节码解释器工作时,就是通过改变这个计算器的值来选取下一条要执行的字节码指令。每条线程都有一个独立的程序计数器。

2、本地方法栈就是执行本地native方法的栈,native方法由虚拟机实现!

3、java虚拟机栈描述的是该线程执行java方法(method)时的内存模型。每一个方法都对应一个栈帧,栈帧中的局部变量表存储了方法中的基本数据类型变量、对象引用变量。

JVM内存模型与运行时数据区域的案例分析

如上图所示,局部变量表保存了方法中声明的8种基本类型变量和对象引用变量。每一个栈帧中还有一个指向运行时常量池的引用,这是指String类型。下面有一个经典的String对象生成的面试题!

4、java堆是JVM中内存最大的一块,被所有线程共享。几乎所有的对象实例都在这里分配,所以java堆也是JVM垃圾回收的主要区域。java堆又被分成了年轻代,老年代;年轻代进一步可以划分为Eden空间,From Survivor空间、To Survivor空间。

JVM内存模型与运行时数据区域的案例分析

当我们使用new关键字分配对象时,就是在java堆中生成对象。

下面分析一下对象生成时的情况。

  1. 因为Eden最大,所以新生成的对象都分配到Eden空间,当Eden空间快满时,进行一次Minor GC,然后将存活的对象复制到From Survivor空间。这时,Eden空间继续向外提供堆内存。

  2. 后面继续生成的对象还是放到Eden空间,当Eden空间又要满的时候,这时候Eden空间和From Survivor空间同时进行一次Minor GC,然后把存活对象放到To Survivor空间。这时,Eden空间继续向外提供堆内存。

  3. 接下来的情况和2一致。Eden空间快满的时候,Eden空间和To Survivor空间进行一次Minor GC,然后存活的对象放到From Survivor空间。

  4. 接下来的情况和3一致。Eden空间快慢的时候,Eden空间和From Survivor空间进行一次Minor GC,然后存活的对象放到To Survivor空间。

  5. 就是说2个Survivor中的一个用来提供对象保存。当Eden空间和某一块Survivor空间GC后,另一块Survivor空间放不下GC后存活的对象;或者是连续Minor GC15次左右的情况;就把这部分存活对象放入到老年代空间。

  6. 当老年代空间也放满的时候,进行Major GC,对老年代空间进行回收。(也叫做Full GC,Full GC的内存消耗很大,应该避免)

年轻代使用的是复制算法:每次Minor GC把Eden区和一块Survivor区的存活对象复制到另一块Survivor区。老年代使用的是标记-整理算法:每次Major GC把存活对象都想内存空间的一端移动,然后直接清理掉端边界以外的内存。

大对象如数组、很长的字符串,直接进入老年代空间。

5、方法区用于存储JVM加载的类信息、final常量、static静态变量等数据,方法区中的数据都是整个程序中唯一的。方法区还包含了运行时常量池,主要存放编译期生成的字面量和符号引用(在类加载后放入)。String对象的字面量就会被放入到运行时常量池中。

垃圾回收在方法区主要是对常量的回收和对类型的卸载。

2、jdk1.8及之后的jvm内存区域,元空间取代了永久代

JVM内存模型与运行时数据区域的案例分析

元空间和永久代的性质是一样的,都是对JVM方法区的实现,作用是一样的。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机JVM内存中,而是使用本地内存。

为什么用元空间取代永久代呢?

  1. 字符串存在永久代中,容易出现性能问题和内存溢出。

  2. 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。

  3. 永久代会为GC带来不必要的复杂度,并且回收效率偏低。

直接内存

JDK1.4之后加入的NIO,引入了基于通道channel和缓冲区buffer的IO,直接使用native函数分配堆外内存,显著提高IO性能,避免了原来BIO的在java堆和naive堆中来回复制数据。

JVM内存模型与运行时数据区域的案例分析

3、字符串String生成时的内存分配情况

参考文章:Java中字符串常量池的详解。

4、生成对象时的内存情况

下面来分析一下我们常见的生成对象或基本数据类型变量的内存模型。这样可以对JVM有一个更好的理解。

int i =3;,一个方法对应一个栈帧,方法中的基本数据类型变量直接在栈帧中分配。如果是static、final类型的基本数据类型则存储在运行时常量池中,和String一样。

Object o1 = new Object();,对象引用(Object o1)存储在栈帧中,但是对象数据(new Object())存储在java堆中,对象类型数据(Class等信息)存储在方法区中。

String s1 = new String("abcd");,使用new声明的对象,对象引用(String s1)存储在栈帧中,对象数据(new String(“abcd”))存储在java堆中,字符串值(“abcd”)存储在运行时常量池中。

String s2 = “abc”,对象引用(String s2)存储在栈帧中,字符串值(“abc”)存储在运行时常量池中。

JVM内存模型与运行时数据区域的案例分析

java栈、java堆、方法区这3者之间的关系大概就是上面的分析所示。

3、各种异常分析

1、java堆内存溢出错误OutOfMemoryError

如果java堆中分配的对象太多,且GC后内存空间还是不够用。下面通过循环生成对象来消耗内存空间进行测试。

相关指令:VM Args: -Xms20m -Xmx40m,表示JVM分配的堆内存最小为20MB,最大为40MB。

 public static void main(String[] args) {
   while (true) {
     List<Object> list = new ArrayList<>(10);
     list.add(new Object());
   }
 }

2、java栈堆栈溢出错误StackoverflowError

如果java栈的栈深度大于JVM允许的深度,就会抛出该错误。下面通过无限递归调用来进行堆栈进行测试。

相关指令:VM Args: -Xss128k,表示JVM分配的栈容量为128KB。

public class StackOOM {
    
    private int length = 1;
    
    public void stackLeak() {
        length++;
        stackLeak();
    }
    
    public static void main(String[] args) {
        StackOOM stackOOM = new StackOOM();
        stackOOM.stackLeak();
    }
}

JVM内存模型与运行时数据区域的案例分析

感谢各位的阅读!关于JVM内存模型与运行时数据区域的案例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节
推荐阅读:
  1. Java内存模型与JVM运行时数据区的区别
  2. JVM内存模型

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm
  • 上一篇新闻:
    php中有哪些属性修饰符
  • 下一篇新闻:
    详解springboot热启动与热部署

猜你喜欢

  • web标准的构成是什么
  • 网站怎么连接远程mysql数据库
  • 香港VPS租用优势和缺陷
  • 微信小程序页面变量名怎么拼接
  • 香港高防服务器的工作方式有哪些
  • 香港高防主要防御什么类型的攻击
  • 微信小程序如何使用其他页面的js
  • 硬盘温度过高怎么办
  • 小程序如何获取页面上多个input值
  • 小程序设置功能页面有什么用
最新资讯
  • DB2在Linux中的自动化运维
  • iterate在数据清洗任务中的实践
  • iterate在分布式数据库中的应用
  • DB2与Linux操作系统的监控整合
  • DB2与Linux系统日志的整合与分析
  • Linux环境下DB2数据库的备份恢复性能优化
  • Linux环境下DB2数据库的备份验证策略
  • Linux下DB2配置技巧揭秘
  • Linux环境中DB2数据库的备份加密实践
  • MyBatis iterate与动态表结构的适应性
相关推荐
  • JVM运行时的数据区域介绍
  • JVM的内存数据区域是什么
  • Java内存模型与JVM运行时数据区有什么区别
  • Java内存区域与内存模型详解
  • JVM内存区域的示例分析
  • JVM系列之内存模型的示例分析
  • JVM中内存区域与内存溢出的示例分析
  • JVM运行时数据区的示例分析
  • JVM运行时区域是怎样的
  • JVM运行时数据区与JMM内存模型是什么

相关标签

jvm内存 jvm内存结构 jvm监控工具 jvm类加载器 jvm类加载机制 jvm垃圾收集器 jvm类 jvm、gc jvm gc idea java jvm docker clone amp jdk jstack elasticsearch 2018 java8
AI

深圳SEO优化公司舟山专业网站优化网站建设推广网站优化报价价格榆林衡水网站优化价格江门搜狗网站推广优化漯河网站优化价格网站建设优化一年赚几十万自媒体优化网站阳江设备网站seo优化成华网站排名优化公司淘宝优化上的网站靠谱吗网站主机优化网站的seo优化公司和龙网站关键词优化盘锦网站优化个人网站优化联系方式上海测量网站优化价格对比上海优化网站排名成都seo网站优化网站排名优化化贵阳百度网站优化安阳ai网站推广优化滁州市seo网站优化百度网站优化外包网站多点击会不会优化排名青岛seo网站优化平顶山网站建设优化哪家专业西安网站优化咨询网站权重优化攻略耀州区网站seo优化排名南通网站优化培训歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化