本篇主要从JVM的内存模型和堆内存详解两个角度整理。

内存模型

JVM中的根据应用使用数据的特性把内存划分为若干个区,根据线程使用的方式可以粗略的分为堆区和栈区,堆区即线程共享的部分(这里的堆区一般指运行时内存),栈区为线程私有的部分(这里的栈区一般指虚拟机栈)。

程序计数器:记录当前线程执行的字节码行号。当CPU执行线程切换时,方便记录每个线程的执行位置。

虚拟机栈(重要):每个方法执行时都会创建栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,方法执行的过程,就是栈帧入栈的过程。当调用栈过深时,就可能触发StackOverflowError异常。

本地方法栈:与虚拟机栈类似,区别是为本地native方法服务。

堆(非常重要):JVM中最大的一块内存区域,存放对象的示例,几乎所有的对象都在这里分配(由于虚拟机的技术发展,不一定会在堆上分配,如栈上分配、标量替换等)。经常提到的垃圾回收主要针对的就是这个堆区,后面会针对垃圾回收再详细整理。一般提到的新生代和年老代都是指这部分内存。

方法区:用于存储JVM加载的类信息、常量、静态变量、即时编译后的代码、运行时常量池等,也被称为永久代。JDK1.8之后采用元空间存储这部分内容。

堆外内存:也叫直接内存,这部分内存并非存在与JVM中,而是直接在物理内存中申请。一般在NIO中比较常见,如Spark等大数据框架都采用堆外内存进行优化,一方面扩展JVM的内存限制,另一方面进行传输时也会提高效率。

运行时内存(堆)

由于不同的垃圾搜集器对内存的细致划分不同,比如G1和CMS,这里就以CMS这种目前使用比较多的回收器为例,看看它的内存细致的划分。首先整个JVM堆可以划分为新生代、年老代、永久代。默认新生代占1/3,年老代占2/3(这个比例由-XX:NewRatio控制),永久代在1.8后由元空间维护。新生代中又按照8:1:1划分为三个区(这个比例由-XX:SurvivorRatio控制)。

先来看看新生代,JVM中新创建的对象(除了大对象,可能直接在年老代中申请)都在Eden区中申请。当内存不足时,会触发minor GC(作用域新生代上的垃圾回收叫做Minor GC, 作用域年老代上的垃圾回收叫做Major GC,作用域全局的垃圾回收叫做Full GC),把Eden区和S1(也叫做S from)的存活对象拷贝到S0(也叫做S to)中。拷贝一次之后,from和to的角色就进行调换。其中如何判断存活对象涉及到可达性分析和引用计数,拷贝对象涉及到垃圾回收算法,如复制算法。其中参数-XX:PretenureSizeThreshold可以控制对象超过多大直接在年老代中申请;参数-XX:MaxTenuringThreshold控制在年轻代经过几次回收后可以进入到年老代中。总的说来,由于新生代中主要存放新创建的对象,而新对象又经常只是临时使用一下,因此无用的对象比较多,通过复制算法可以快速的把存货对象整理到新的内存空间中,避免形成空间碎片,但是缺点是比较费内存。

年老代的垃圾回收就相对简单一些,在内存空间不足或没有足够的连续内存时会触发Major GC。一般会采用标记清除算法,先标记存货对象,然后进行回收。在CMS算法中可以通过参数-XX:CMSFullGCsBeforeCompaction=0控制经过多少次年老代的回收执行一次整理,避免碎片。

永久代主要存放类等元数据信息,在jdk1.8之前通过PermSize在堆中分配,超过这个值就会抛出PermGen内存溢出。后来为了避免堆内存溢出,在jdk1.8之后采用元空间代替,在本地内存中直接分配。一般只要你的应用不是大量的加载jar,这部分空间一般不需要注意。

jvm内存模型_JVM基础:内存模型相关推荐

  1. jvm内存模型_JVM|02内存模型

    JVM内存模型 概述 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保 ...

  2. java 64位 默认分配内存大小_JVM默认内存大小

    堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在Java虚拟机启动时创建的." ...

  3. 内存溢出_JVM|03内存溢出实战

    实战 内存溢出定位与分析 环境搭建 /** * 模拟测试插入一百万条字符串[image.png](https://img.hacpai.com/file/2019/08/image-dd10de62. ...

  4. Python经典前端框架:Django,第三天【Django基础教学--模型】

    Django基础教学--模型 Django基础教学--模型 操作环境 安装第三方库 前言 模型定义: 连接Mysql数据库的一些配置 连接数据库重点 创建模型 记录模型操作 为什么有这个文件 同步到数 ...

  5. jvm内存模型和java内存模型_JVM运行时内存模型综述

    JVM内存模型 JVM分为五个区域:虚拟机栈.本地方法栈.方法区.堆.程序计数器. JVM不同区域的占用内存大小不同,一般情况下堆最大,程序计数器较小. JVM五个区中虚拟机栈.本地方法栈.程序计数器 ...

  6. jvm内存模型_JVM内存模型的相关概念

    1.前言 Android的虚拟机是根据移动设备的特点基于Java虚拟机(JVM)改进而来,虽然没有保留规范,但作为Java语言的使用者,了解一下JVM的规范还是有必要的. 2.JVM内存模型 JVM在 ...

  7. jvm内存参数配置_JVM内存结构和Java内存模型

    一.JVM 首先看一张JVM结构图(某度找的) 主要看运行时数据区,里边有方法区,堆,java虚拟机栈,本地方法栈,程序计数器.其中方法区和堆是线程共享的,也是JVM进行垃圾收集的区域,java虚拟机 ...

  8. JVM详解(类加载,内存分配,GC,内存模型)

    一. 背景 1. 前言 作为一位Java开发工作者,在关心业务代码开发的同时,我们也需要了解java底层时如何运作的,了解为什么说java是跨平台的语言,所以这一篇对JVM(java虚拟机)进行剖析和 ...

  9. JVM内存模型 和 Java内存模型 对比学习

    前言 首先要知道这两者不是同一个东西,Jvm内存模型 也叫 Java内存区域.Java运行时数据区域 而Java内存模型 是 JMM (Java Memory Model,简称 JMM),是定义了线程 ...

最新文章

  1. jmeter操作数据库
  2. exchange揭开拨号音还原法的神秘面纱
  3. 全球及中国数字出版产业投资产值与运营模式咨询报告2022版
  4. 两根硬铜线并线接插座_高级电工原来都这样接电线,手法还没见过,我也立马学...
  5. 史上最难高考数学,全国平均26分...
  6. android获取应用安装通知消息,如何在Android 11 上获取已安装应用列表
  7. 再议指针和引用的一些事情吧
  8. 几种常用网页返回顶部的代码
  9. 三维点云数据处理软件供技术原理说明_三维扫描数据处理技术_点云数据处理...
  10. protobuf 微信小程序_微信小程序使用Protobuf
  11. iOS 第三方库、插件、知名博客总结
  12. 史蒂夫·保罗·乔布斯
  13. Jetson nano——控制风扇旋转速度的方法
  14. Swift上写百度地图记录
  15. CF727E. Games on a CD (Hash)
  16. Java面试进阶指北
  17. DOS窗口下使用命令打开远程桌面连接
  18. 高手和普通人的区别,就在破局思维
  19. android+蓝牙+文件传输,蓝牙文件传输Android
  20. Oracle 字符集 原理及问题解决 (全)

热门文章

  1. 游泳后精疲力尽_精疲力尽的编程后如何重回正轨
  2. 重构javascript_JavaScript代码清理:如何重构以使用类
  3. x3850x5启动代码c2_代码小时x 2,080
  4. python md5加密数据
  5. springmvc常用注解与类型转换
  6. php输入多少数值自动乘,报表数据填报中的自动计算
  7. windows下安装ta-lib的方法
  8. 最全总结!聊聊 Python 发送邮件的几种方式
  9. python爬虫进阶教程:百万英雄答题辅助系统
  10. Python中groupby的简单使用