JVM内存模型知识点总结

 更新时间:2019年05月26日 14:02:03   投稿:laozhang  
在本篇文章里小编给大家分享了关于JVM内存模型的学习心得以及相关知识点总结,有兴趣的朋友们跟着学习下。

内存模型如下图所示

堆是Java虚拟机所管理的内存最大一块。堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域唯一的目的就是存放对象实例。所有的对象实例都在这里分配内存

Java堆是垃圾收集器管理的主要区域。从内存回收的角度来看,由于现在的垃圾收集器采用的是分代收集算法。所以,java堆又分为新生代和老年代。从内存分配的角度来说,线程共享的java对中可能划分出多个线程私有的fenp缓冲区(Thread Local Allocation Buffer)。

可以通过 -Xms、-Xmx分别控制堆初始化是最小堆内存和最大堆内存大小。

虚拟机栈

与程序计数器一样,java虚拟机栈也是线程私有的,他的生命周期与线程相同。

虚拟机栈描述的是Java方法的执行的内存模型:每个方法在执行的同时会创建一个栈桢(stack frame)用于存储局部变量表、操作数栈、动态链表、方法出口等信息。每个方法从调用直至执行完成的过程,就对应着栈桢在虚拟机栈中入栈到出栈的过程。

虚拟机栈存储的数据类型 局部变量表

存放的是编译器可知得到各种基本数据类型

boolean、byte、char、short、int、float、long、double、对象引用(refrence类型,不等同于对象本身,一个指向对象的起始内存位置的引用指针) 操作数栈动态链表方法出口

常见异常在虚拟机规范中,对这个区域规定了两种异常情况: 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError

如果虚拟机栈可以动态扩展,扩展时无法申请做够的内存,将会爬出OutOfMemorryError

本地方法栈

与虚拟机栈发挥的作用非常类似,他们之间的区别是虚拟机栈为虚拟机执行java方法服务,而本地方法栈则为虚拟机使用到的native方法服务。与虚拟机栈一样,本地房发展区域也会抛出StackOverflowError,OutOfMemorryError异常。

方法区(1.8后该区域被废弃)

方法区与java堆一样,是各个线程所共享的,它用来存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

方法区是jvm提出的规范,而永久代就是方法区的具体实现。

java虚拟机对方法区的限制非常宽松,可以像堆一样不需要连续的内存可可选择的固定大小外,还可以选择不识闲垃圾收集,相对而言,垃圾收集行为在这边区域是比较少出现的。

在方法区会报出 永久代内存溢出的错误。而java1.8为了解决这个问题,就提出了meta space(元空间)的概念,就是为了解决永久代内存溢出的情况,一般来说,在不指定 meta space大小的情况下,虚拟机方法区内存大小就是宿主主机的内存大小

程序计数器

程序计数器是一块较小的内存空间,他可以看做是当前线程所执行字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选择下一条将要执行的字节码指令。

由于JAVA虚拟机的多线程是通过多线程流转切换并分配处理器执行时间的方式来实现的。在任一一个确定的时刻,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各个线程的计数器之间互不影响,独立存储,我们称该类内存区域为线程私有

如果线程正在执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。

运行时常量池

运行时常量池是方法区的一部分。Class文件除了 有类的版本、字段、方法、接口等描述信息外,还有一项是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容在类加载后进入方法区的运行时常量池。

运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性.Java语言并不要求常量一定只有在编译器才能产生,依旧是并非预置入Class文件中的常量池的内容才能进入方法区运行时常量池

以上就是关于学习JVM内存模型的知识点内容总结,感谢大家对脚本之家的支持。

相关文章

  • Java使用Tinify实现图片无损压缩(4M无损压缩到1M)的方法

    Java使用Tinify实现图片无损压缩(4M无损压缩到1M)的方法

    在当今的数字化时代,图片已成为网站、应用和社交媒体中不可或缺的元素,然而,大尺寸的图片不仅会增加页面或者客户端加载时间,还会占用大量的存储空间,本文将详细介绍如何利用Tinify压缩图片,并将其上传至OSS,重点介绍图片压缩实现方式,需要的朋友可以参考下
    2024-08-08
  • 浅析Java中Split函数的用法技巧

    浅析Java中Split函数的用法技巧

    在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些小技巧。以下我就为大家介绍,需要的朋友可以参考下
    2013-07-07
  • Java 8中HashMap的底层原理解析

    Java 8中HashMap的底层原理解析

    HashMap作为Java中常用的数据结构之一,在JDK 1.8中经过了一系列的优化和改进,深入理解其底层原理,包括哈希算法、数组与链表结构、红黑树的引入等,有助于更好地使用和理解HashMap的性能特性,这篇文章主要介绍了Java 8中HashMap的底层原理,需要的朋友可以参考下
    2023-11-11
  • Java无法获取真实IP解决方案

    Java无法获取真实IP解决方案

    这篇文章主要介绍了Java无法获取真实IP解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Java使用Queryable-pageable实现分页效果

    Java使用Queryable-pageable实现分页效果

    这篇文章主要为大家介绍了Java如何使用Queryable-pageable从而实现分页效果,文中的示例代码简洁易懂,感兴趣的小伙伴可以动手尝试一下
    2022-06-06
  • Java读写txt文件时防止中文乱码问题出现的方法介绍

    Java读写txt文件时防止中文乱码问题出现的方法介绍

    这篇文章主要介绍了Java读写txt文件时防止中文乱码问题出现的方法,同时需要注意系统默认的文本保存编码的设置,需要的朋友可以参考下
    2015-12-12
  • 彻底解决IDEA中SpringBoot热部署无效的问题(推荐)

    彻底解决IDEA中SpringBoot热部署无效的问题(推荐)

    这篇文章主要介绍了彻底解决IDEA中SpringBoot热部署无效的问题,本文给大家带来问题原因分析通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09
  • J2SE基础之在Eclipse中运行hello world

    J2SE基础之在Eclipse中运行hello world

    本文的内容非常的简单,跟随世界潮流,第一个Java程序输出“Hell World!”。希望大家能够喜欢
    2016-05-05
  • SpringCloud网关组件zuul实例解析

    SpringCloud网关组件zuul实例解析

    这篇文章主要介绍了SpringCloud网关组件zuul实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Spingboot JPA CriteriaBuilder 如何获取指定字段

    Spingboot JPA CriteriaBuilder 如何获取指定字段

    这篇文章 主要介绍了Spingboot JPA CriteriaBuilder 如何获取指定字段,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论