目录 1.1. JVM内存模型总体架构图 1 1.2. JAVA堆 2 1.3. 方法区 元空间(Metaspace) 2 1.4. 虚拟机栈 3 1.5. 本地方法区 4 2. 垃圾回收算法 4 2
目录
1.1. JVM内存模型总体架构图 1
1.2. JAVA堆 2
1.3. 方法区 元空间(Metaspace) 2
1.4. 虚拟机栈 3
1.5. 本地方法区 4
2. 垃圾回收算法 4
2.1. 标记-清除算法(Mark-Sweep) 4
2.2. 复制算法(copying) 4
2.3. 标记-压缩算法(Mark-compact) 5
3. JVM参数: 6
4. 查看工具 7
4.1. jconsole.exe 7
4.2. D:\jdk1.8.0_31\bin\jvisualvm.exe 8
5. ref 8
- JVM内存模型总体架构图
- JAVA堆
线程共享的,存放所有对象实例和数组。垃圾回收的主要区域。可以分为新生代和老年代(tenured)。
新生代用于存放刚创建的对象以及年轻的对象,如果对象一直没有被回收,生存得足够长,老年对象就会被移入老年代。
新生代又可进一步细分为eden、survivorSpace0(s0,from space)、survivorSpace1(s1,to space)。刚创建的对象都放入eden,s0和s1都至少经过一次GC并幸存。如果幸存对象经过一定时间仍存在,则进入老年代(tenured)。
- 方法区 元空间(Metaspace)
线程共享的,用于存放被虚拟机加载的类的元数据信息:如常量、静态变量、即时编译器编译后的代码。也成为永久代。如果hotspot虚拟机确定一个类的定义信息不会被使用,也会将其回收。回收的基本条件至少有:所有该类的实例被回收,而且装载该类的ClassLoader被回收
元空间(Metaspace)
3.1元空间的内存大小
元空间是方法区的在HotSpot jvm 中的实现,方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。,理论上取决于32位/64位系统可虚拟的内存大小。可见也不是无限制的,需要配置参数。
根据上面的各种原因,永久代最终被移除,方法区移至Metaspace,字符串常量移至Java Heap。
随着JDK8的到来,JVM不再有PermGen。但类的元数据信息(metadata)还在,只不过不再是存储在连续的堆空间上,而是移动到叫做“Metaspace”的本地内存(Native memory)中。
程序计数器
多线程时,当线程数超过CPU数量或CPU内核数量,线程之间就要根据时间片轮询抢夺CPU时间资源。因此每个线程有要有一个独立的程序计数器,记录下一条要运行的指令。线程私有的内存区域。如果执行的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器为空。
- 虚拟机栈
线程私有的,与线程在同一时间创建。管理JAVA方法执行的内存模型。每个方法执行时都会创建一个桢栈来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信息。栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss参数可以设置虚拟机栈大小)。栈的大小可以是固定的,或者是动态扩展的。如果请求的栈深度大于最大可用深度,则抛出stackOverflowError;如果栈是可动态扩展的,但没有内存空间支持扩展,则抛出OutofMemoryError。
使用jclasslib工具可以查看class类文件的结构。下图为栈帧结构图:
- 本地方法区
和虚拟机栈功能相似,但管理的不是JAVA方法,是本地方法,本地方法是用C实现的。
- 垃圾回收算法
- 标记-清除算法(Mark-Sweep)
从根节点开始标记所有可达对象,其余没标记的即为垃圾对象,执行清除。但回收后的空间是不连续的。
- 复制算法(copying)
将内存分成两块,每次只使用其中一块,垃圾回收时,将标记的对象拷贝到另外一块中,然后完全清除原来使用的那块内存。复制后的空间是连续的。复制算法适用于新生代,因为垃圾对象多于存活对象,复制算法更高效。在新生代串行垃圾回收算法中,将eden中标记存活的对象拷贝未使用的s1中,s0中的年轻对象也进入s1,如果s1空间已满,则进入老年代;这样交替使用s0和s1。这种改进的复制算法,既保证了空间的连续性,有避免了大量的内存空间浪费。
- 标记-压缩算法(Mark-compact)
适合用于老年代的算法(存活对象多于垃圾对象)。
标记后不复制,而是将存活对象压缩到内存的一端,然后清理边界外的所有对象。
- JVM参数:
-XX:+PrintGCDetails 打印垃圾回收信息
-Xms 为Heap区域的初始值,线上环境需要与-Xmx设置为一致,否则capacity的值会来回飘动
-Xmx 为Heap区域的最大值
-Xss(或-ss) 线程栈大小(指一个线程的native空间)1.5以后是1M的默认大小
-XX:PermSize与-XX:MaxPermSize 方法区(永久代)的初始大小和最大值(但不是本地方法区)
-XX:NewRatio 老年代与新生代比率
-XX:SurvivorRatio Eden与Survivor的占用比例。例如8表示,一个survivor区占用 1/8 的Eden内存,即1/10的新生代内存,为什么不是1/9?因为我们的新生代有2个survivor,即S1和S22。所以survivor总共是占用新生代内存的 2/10,Eden与新生代的占比则为 8/10。
-XX:MaxHeapFreeRatio GC后,如果发现空闲堆内存占到整个预估的比例小于这个值,则减小堆空间。
-XX:MinHeapFreeRatio GC后,如果发现空闲堆内存占到整个预估的比例大于这个值,则增大堆空间。
-XX:NewSize 新生代大小
- 查看工具
- jconsole.exe
- D:\jdk1.8.0_31\bin\jvisualvm.exe
- ref
JDK8-废弃永久代(PermGen)迎来元空间(Metaspace) - 只会一点java - 博客园.html
目录 1.1. JVM内存模型总体架构图 1 1.2. JAVA堆 2 1.3. 方法区 元空间(Metaspace) 2 1.4. 虚拟机栈 3 1.5. 本地方法区 4 2. 垃圾回收算法 4 2相关推荐
- 深入浅出JVM内存模型+垃圾回收算法
文章目录 前言 JVM内存模型 1. 程序计数器(记录当前线程) 2. Java栈(虚拟机栈) 3. 本地方法栈 4. 堆 5.方法区 6.直接内存 JVM垃圾回收 垃圾判断标准 1. 引用计数法 2 ...
- JVM—内存模型JMM
原文作者:qzqanlhy1314 原文地址:jvm 内存模型 目录 一.jvm 内存模型划分 二.虚拟机栈 三.堆 四.元数据区域 五.直接内存 一.jvm 内存模型划分 根据JVM规范,JVM 内 ...
- JVM 内存模型与内存分配方式
文章目录 JVM 内存模型概述 基于分代收集理论设计的垃圾收集器所管理的堆结构 方法区的演变 内存分配 划分内存的方法 划分内存时如何解决并发问题 对象栈上分配 基于分代收集理论的垃圾收集器管理下的内 ...
- JVM内存模型和类加载运行机制
JVM内存模型和类加载运行机制 JVM内存模型 运行一个 Java 应用程序,必须要先安装 JDK 或者 JRE 包.因为 Java 应用在编译后会变成字节码,通过字节码运行在 JVM 中,而 JVM ...
- JVM内存模型、相关参数设置与命令查看
JVM内存模型.相关参数设置与命令查看 JVM内存模型,你看这一篇就够了 - 知乎 (zhihu.com) Java虚拟机-Java8内存模型JVM(整理版) - 牧梦者 - 博客园 (cnblogs ...
- java 内存模型面试_Java面试- JVM 内存模型讲解
经常有人会有这么一个疑惑,难道 Java 开发就一定要懂得 JVM 的原理吗?我不懂 JVM ,但我照样可以开发.确实,但如果懂得了 JVM ,可以让你在技术的这条路上走的更远一些. JVM 的重要性 ...
- 深入理解Java虚拟机:jvm内存模型jdk1.8
深入理解Java虚拟机:jvm内存模型jdk1.8 一.程序计数器 使用PC寄存器存储字节码指令地址有什么作用?为什么使PC寄存器记录当前线程的执行地址? PC寄存器为什么会被设定为线程私有? 二.J ...
- 【JVM】JVM内存模型详解
一.JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收 ...
- JVM内存模型,你看这一篇就够了
摘要:JVM是一种用于计算设备的规范,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的. 本文分享自华为云社区<[云驻共创]JVM内存模型的探知之旅>,作者:多米 ...
- 膜拜大佬!JVM性能调优——JVM内存模型和类加载运行机制
一.JVM内存模型 运行一个 Java 应用程序,必须要先安装 JDK 或者 JRE 包.因为 Java 应用在编译后会变成字节码,通过字节码运行在 JVM 中,而 JVM 是 JRE 的核心组成部分 ...
最新文章
- 操作 Wave 文件(14): waveOutSetPlaybackRate、waveOutSetPitch
- 玄元剑仙服务器列表为空,玄元剑仙3月11日维护更新公告
- Hystrix中的批量(折叠)请求
- 如何自定义CSS滚动条的样式?
- rsyslog syslog详解
- 如果你20秒钟还看不懂这个短信的话,说明你还纯洁!?
- Flutter mac 环境搭建 最简教程
- (110)FPGA面试题-介绍Verilog块语句begin-end执行过程
- pytorch输出分类结果并显示每个类别的概率
- Angular2开发拙见——组件规划篇
- 服务器ghost备份后无法进入系统还原,如下图,电脑开不起来了,重新ghost恢复备份的系统后启动依旧蓝屏,怎么办?...
- 华为Mate30安装google play服务最全方法
- 计算机拨号连接无法建立连接,电信拨号上网连接不上的解决方法
- 如何用LaTeX写简历
- linux ubi 分区,linux UBI文件系统简介
- 微信早安,利用uniCloud阿里云的云函数实现定时推送
- 一次让人晕到吐血的接包经历
- 【CVPR 2021】Cylinder3D:用于LiDAR点云分割的圆柱体非对称3D卷积网络
- 谷歌浏览器打开显示2345或360等其他主页的解决方法
- CentOS7搭建小型CDN