java内存模型学习

根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。

虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区;另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存。

  1. 虚拟机栈,JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息。栈的大小可以固定也可以动态扩展。当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误

  2. 本地方法栈,JVM规范为了允许native代码可以调用Java代码,以及允许Java代码调用native方法,还规定每个Java线程拥有自己的独立的native方法栈。

  3. 方法区存放了一些常量、静态变量、类信息等,可以理解成class文件在内存中的存放位置。方法区也是所有线程共享。主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫”非堆”。

所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。

而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池

PermGen(永久代) 其实,移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。

METHOD AREA,它是一块线程共享的对象,名为方法区,在HotSpot虚拟机中,这块METHOD AREA我们可以认为等同于持久代(PermGen),在Java 6及之前的版本,持久代存放了以下一些内容:

  • 虚拟机加载的类信息
  • 常量池
  • 静态变量
  • 即时编译后的代码

到了Java 7之后,常量池已经不在持久代之中进行分配了,而是移到了堆中,即常量池和对象共享堆内存。接着到了Java 8之后的版本(至此篇文章,Java 10刚发布),持久代已经被永久移除,取而代之的是Metaspace。Metaspace是方法区在HotSpot中的实现,它与持久代最大的区别在于:Metaspace并不在虚拟机内存中而是使用本地内存。因此Metaspace具体大小理论上取决于32位/64位系统可用内存的大小
http://www.importnew.com/28571.html

1 String s1 = “Hello”; 2 String s2 = “Hello”; 3 String s3 = “Hel” + “lo”; 4 String s4 = “Hel” + new String(“lo”); 5 String s5 = new String(“Hello”); 6 String s6 = s5.intern(); 7 String s7 = “H”; 8 String s8 = “ello”; 9 String s9 = s7 + s8; 10 11 System.out.println(s1 == s2); // true 12 System.out.println(s1 == s3); // true 13 System.out.println(s1 == s4); // false 14 System.out.println(s1 == s9); // false 15 System.out.println(s4 == s5); // false 16 System.out.println(s1 == s6); // true

4、PC 寄存器:

PC 寄存器,也叫程序计数器。JVM支持多个线程同时运行,每个线程都有自己的程序计数器。倘若当前执行的是 JVM 的方法,则该寄存器中保存当前执行指令的地址;倘若执行的是native 方法,则PC寄存器中为空。

5,堆堆内存是 JVM 所有线程共享的部分,在虚拟机启动的时候就已经创建。所有的对象和数组都在堆上进行分配。这部分空间可通过 GC 进行回收。当申请不到空间时会抛出 OutOfMemoryError

上面可以看到堆分成三个区域:

  • 新生代(Young Generation):用于存放新创建的对象,采用复制回收方法,如果在s0和s1之间复制一定次数后,转移到年老代中。这里的垃圾回收叫做minor GC;
  • 年老代(Old Generation):这些对象垃圾回收的频率较低,采用的标记整理方法,这里的垃圾回收叫做 major GC。
  • 永久代(Permanent Generation):存放Java本身的一些数据,当类不再使用时,也会被回收。

Original: https://www.cnblogs.com/danghuijian/p/8847865.html
Author: dhj
Title: java内存模型学习

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538323/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring源码分析-BeanFactoryPostProcessor

    Spring源码分析-BeanFactoryPostProcessor 博主技术有限,本文难免有错误的地方,如果您发现了欢迎评论私信指出,谢谢JAVA技术交流群:737698533…

    Java 2023年6月6日
    0128
  • Java synchronized锁升级过程验证

    ​ Java对象结构 一个对象包括三部分: 对象头 实例数据 对其填充 对象头: Mark Word:用于存储对象自身运行时的数据,如哈希码(Hash Code),GC分代年龄,锁…

    Java 2023年6月13日
    095
  • 服务调用过程

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 源码分析均基于官方Demo,路径:dubbo/dubbo-demo 如果没有…

    Java 2023年6月16日
    073
  • spring mvc jsonp调用示例

    服务端代码:主要是返回的时候,返回值要用callback包装一下 /** * JSONP调用 * * @param request * @return */ @RequestMap…

    Java 2023年5月30日
    066
  • 阿里云RocketMQ定时/延迟消息队列实现

    一、业务需求 需要实现一个提前二十分钟通知用户去做某件事的一个业务,拿到这个业务首先想到的最简单得方法就是使用Redis监控Key值:在排计划时候计算当前时间与提前二十分钟这个时间…

    Java 2023年6月13日
    081
  • Java基础随笔2

    ++:自增 –:自减 单独使用的时候,++或者–无论是放在变量的前面还是后面,结果是一样的。 参与操作的时候: 如果++或者–在变量的后面,先拿…

    Java 2023年6月5日
    073
  • Java学习-第一部分-第二阶段-第一节:面向对象编程(高级)

    面向对象编程(高级) 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 类变量和类方法(static) 类变量 类…

    Java 2023年6月16日
    075
  • golang并发编程中select关键字的使用

    golang并发编程中select关键字的使用 select的使用类似于switch语句,有case和default分支。其中每个case对应一个通道的通信过程: 1、select…

    Java 2023年6月13日
    072
  • java如何效率较高的判断list为空

    判空 时间复杂度 可读性 我们都知道判断list为空可以通过两种途径: 一、 1 List list = new ArrayList(2); 2 System.out.printl…

    Java 2023年6月13日
    073
  • Java 集合常见知识点&面试题总结(上),2022 最新版!

    你好,我是 Guide。秋招即将到来(提前批已经开始),我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你。 你也可以在网站(javaguide…

    Java 2023年6月9日
    098
  • 浅谈kali : aircrack-ng套件

    aircrack-ng 套件包含有: Name Description aircrack-ng 破解WEP以及WPA(字典攻击)密钥 airdecap-ng airmon-ng 将…

    Java 2023年6月7日
    062
  • 封装RabbitTemplate,使用自定义消息转换器

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    071
  • JavaWeb环境配置

    Tomcat 在系统环境中添加:CATALINA_BASE == D:\tomcat8 ; CATALINA_HOME == D:\tomcat8 ;配置好后在path环境中添加 …

    Java 2023年6月5日
    098
  • RabbitMQ——ACK确认机制

    一。介绍 1.消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除 2.消费者在处理消息出现了网络不稳定、服务器异…

    Java 2023年5月30日
    0118
  • Mycat windos版(详细步骤)

    第一步:mycat下载 先下载一个运行环境框架包。 下载地址: http://dl.mycat.org.cn/2.0/install-template/ 我下载的版本:(mycat…

    Java 2023年6月5日
    0118
  • Redis-firewall使用命令

    Redis-firewall使用命令 一、iptables防火墙 1、基本操作 查看防火墙状态 service iptables status 停止防火墙 service ipta…

    Java 2023年6月5日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球