jvm内存模型_JVM基础:内存模型
本篇主要从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基础:内存模型相关推荐
- jvm内存模型_JVM|02内存模型
JVM内存模型 概述 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保 ...
- java 64位 默认分配内存大小_JVM默认内存大小
堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在Java虚拟机启动时创建的." ...
- 内存溢出_JVM|03内存溢出实战
实战 内存溢出定位与分析 环境搭建 /** * 模拟测试插入一百万条字符串[image.png](https://img.hacpai.com/file/2019/08/image-dd10de62. ...
- Python经典前端框架:Django,第三天【Django基础教学--模型】
Django基础教学--模型 Django基础教学--模型 操作环境 安装第三方库 前言 模型定义: 连接Mysql数据库的一些配置 连接数据库重点 创建模型 记录模型操作 为什么有这个文件 同步到数 ...
- jvm内存模型和java内存模型_JVM运行时内存模型综述
JVM内存模型 JVM分为五个区域:虚拟机栈.本地方法栈.方法区.堆.程序计数器. JVM不同区域的占用内存大小不同,一般情况下堆最大,程序计数器较小. JVM五个区中虚拟机栈.本地方法栈.程序计数器 ...
- jvm内存模型_JVM内存模型的相关概念
1.前言 Android的虚拟机是根据移动设备的特点基于Java虚拟机(JVM)改进而来,虽然没有保留规范,但作为Java语言的使用者,了解一下JVM的规范还是有必要的. 2.JVM内存模型 JVM在 ...
- jvm内存参数配置_JVM内存结构和Java内存模型
一.JVM 首先看一张JVM结构图(某度找的) 主要看运行时数据区,里边有方法区,堆,java虚拟机栈,本地方法栈,程序计数器.其中方法区和堆是线程共享的,也是JVM进行垃圾收集的区域,java虚拟机 ...
- JVM详解(类加载,内存分配,GC,内存模型)
一. 背景 1. 前言 作为一位Java开发工作者,在关心业务代码开发的同时,我们也需要了解java底层时如何运作的,了解为什么说java是跨平台的语言,所以这一篇对JVM(java虚拟机)进行剖析和 ...
- JVM内存模型 和 Java内存模型 对比学习
前言 首先要知道这两者不是同一个东西,Jvm内存模型 也叫 Java内存区域.Java运行时数据区域 而Java内存模型 是 JMM (Java Memory Model,简称 JMM),是定义了线程 ...
最新文章
- jmeter操作数据库
- exchange揭开拨号音还原法的神秘面纱
- 全球及中国数字出版产业投资产值与运营模式咨询报告2022版
- 两根硬铜线并线接插座_高级电工原来都这样接电线,手法还没见过,我也立马学...
- 史上最难高考数学,全国平均26分...
- android获取应用安装通知消息,如何在Android 11 上获取已安装应用列表
- 再议指针和引用的一些事情吧
- 几种常用网页返回顶部的代码
- 三维点云数据处理软件供技术原理说明_三维扫描数据处理技术_点云数据处理...
- protobuf 微信小程序_微信小程序使用Protobuf
- iOS 第三方库、插件、知名博客总结
- 史蒂夫·保罗·乔布斯
- Jetson nano——控制风扇旋转速度的方法
- Swift上写百度地图记录
- CF727E. Games on a CD (Hash)
- Java面试进阶指北
- DOS窗口下使用命令打开远程桌面连接
- 高手和普通人的区别,就在破局思维
- android+蓝牙+文件传输,蓝牙文件传输Android
- Oracle 字符集 原理及问题解决 (全)