一:Java技术体系模块图

二:JVM内存区域模型

1.方法区

也称”永久代” 、“非堆”,  它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。

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

2.虚拟机栈

描述的是Java 方法执行的内存模型:每个方法被执行的时候 都会创建一个“栈帧”用于存储局部变量表(包括参数)、操作栈、方法出口等信息。每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。声明周期与线程相同,是线程私有的。

局部变量表存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(引用指针,并非对象本身),其中64位长度的long和double类型的数据会占用2个局部变量的空间,其余数据类型只占1个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量是完全确定的,在运行期间栈帧不会改变局部变量表的大小空间。

3.本地方法栈

与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。

4.堆

也叫做java 堆、GC堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建。该内存区域存放了对象实例及数组(所有new的对象)。其大小通过-Xms(最小值)和-Xmx(最大值)参数设置,-Xms为JVM启动时申请的最小内存,默认为操作系统物理内存的1/64但小于1G,-Xmx为JVM可申请的最大内存,默认为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列;当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过XX:MaxHeapFreeRation=来指定这个比列,对于运行系统,为避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样。

由于现在收集器都是采用分代收集算法,堆被划分为新生代和老年代。新生代主要存储新创建的对象和尚未进入老年代的对象。老年代存储经过多次新生代GC(Minor GC)任然存活的对象。

新生代:

程序新创建的对象都是从新生代分配内存,新生代由Eden Space和两块相同大小的Survivor Space(通常又称S0和S1或From和To)构成,可通过-Xmn参数来指定新生代的大小,也可以通过-XX:SurvivorRation来调整Eden Space及Survivor Space的大小。

老年代:

用于存放经过多次新生代GC任然存活的对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:①.大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。②.大的数组对象,切数组中无引用外部对象。

老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。

5.程序计数器

是最小的一块内存区域,它的作用是当前线程所执行的字节码的行号指示器,在虚拟机的模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。

三:直接内存

直接内存并不是虚拟机内存的一部分,也不是Java虚拟机规范中定义的内存区域。jdk1.4中新加入的NIO,引入了通道与缓冲区的IO方式,它可以调用Native方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小。

本系列:

  • Java虚拟机学习(1):体系结构 内存模型
原文出处: java2000_wl
from: http://www.importnew.com/22217.html

Java虚拟机学习(1):体系结构 内存模型相关推荐

  1. Java虚拟机学习 - 体系结构 内存模型(转载)

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代" ."非堆",  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内 ...

  2. Java虚拟机学习 - 体系结构 内存模型

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代" ."非堆", 它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存 ...

  3. Java虚拟机学习总结(1)——JVM内存模型

    前言 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 程序计数器 :Java虚拟机栈 :本地方法栈 :堆 :方法区.Java虚拟机中的内存分配图 : ...

  4. Java虚拟机学习(7):对象内存分配与回收

    对象优先在Eden上分配 大多数情况下,对象优先在新生代Eden区域中分配.当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次 Minor GC(新生代GC).Minor GC期间虚拟机将E ...

  5. Java虚拟机学习(5):内存调优

    JVM调优主要是针对内存管理方面的调优,包括控制各个代的大小,GC策略.由于GC开始垃圾回收时会挂起应用线程,严重影响了性能,调优的目是为了尽量降低GC所导致的应用线程暂停时间. 减少Full GC次 ...

  6. JVM学习 - 体系结构 内存模型

    2019独角兽企业重金招聘Python工程师标准>>> 一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代" ."非堆&quo ...

  7. java程序经过编译后会产生byte code_Java 虚拟机(JVM)内存模型

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自不同的用途,以及创建和销毁时间,有些区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和 ...

  8. 【深入理解Java虚拟机学习笔记】第二章 Java 内存区域与内存溢出异常

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  9. 【学习笔记】Java虚拟机(二)内存区域与内存溢出

    运行时数据区域 根据<Java虚拟机贵发(Java SE 7版本)>的规定,Java虚拟机所管理的内存包含以下几个运行时 数据区域.借图: 1.程序计数器 程序计数器(Program Co ...

最新文章

  1. android中文首字母排序,Android上汉字按拼音排序如何实现?
  2. 通俗易懂:快速理解ipv4的NAT穿透原理
  3. Metasploit AFP爆破模块afp_login
  4. 【实例记录】在ubuntu上运行python实现与单片机多线程串口通信
  5. Django(part53)--404模板文件
  6. mysql linux安装百度经验_MySQL 安装(Windows Linux)
  7. 平面设计完全手册_工业时代的平面设计
  8. 服务器双系统快捷键,mac双系统切换快捷键
  9. SAP中寄售结算规则及要点分析
  10. html制作日程安排,如何制作一个Web日程安排表?
  11. U盘安装ESXI 6.7,并使用U盘启动服务器
  12. 几组数据的相关性python_几的笔顺 笔画数:2 拼音:jī,jǐ 部首:几 - 智慧山
  13. 微型计算机第十一章答案,计算机习题答案总.docx
  14. 2021-10-11 今日总结
  15. mcldownload文件夹_download文件夹是什么?Win7系统download文件夹可以删除?
  16. linux怎么打出管道命令这个符号,linux 管道命令 竖线 ‘ | ’
  17. 拼多多“百亿农研”开辟发展新路径
  18. 计算机量子化学计算焓变,物理化学实验
  19. Matlab常见错误---带有下标的赋值维度不匹配。
  20. USB端口的打印机映射成LPT并口

热门文章

  1. Lesson 8.18.2 单层回归神经网络torch.nn.Linear实现单层回归神经网络的正向传播
  2. 微软 CTO 韦青:对微软这样已经走过44年的公司,现在也只是个小小小的开始!!!
  3. 机器之心 Synced 08月12日 20:59
  4. 实战SSM_O2O商铺_31【商品】商品添加之View层的实现
  5. linux blender 中文乱码,Blender2.7.8中文显示框框乱码该怎么办?
  6. of python检索文献 science web_硕博士都在学的Python神技,有大神带!
  7. ad09机械层说明_悉数PCB上的各种层
  8. mongodb 事务_MongoDB4 事务 简单易懂的??
  9. r k-means 分类结果_R语言信用评分卡:数据分箱(binning)
  10. 使用JavaScript代码制作99乘法表