目的

  • 快速定位JVM内存泄漏或者溢出等问题。
  • 面试基础题,加分项。

文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

程序计数器(Program Counter Register)

  • 记录当前线程所执行的字节码的行号。
  • 依赖其实现分支、循环、跳转、异常处理、线程恢复。
  • Natvie 方法时,其的值就为空。
  • Java 虚拟机规范中唯一没有规定内存溢出的区域。
  • “线程私有”的内存区域。

文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

虚拟机栈(Virtual Machine Stacks)

  • 其生命周期与线程相同。
  • 存储局部变量表、操作数栈、动态链接、方法出口等信息。
  • 方法被执行的时候创建一个栈帧并入栈。
  • 方法执行完成的时候对应栈帧出栈。
  • 栈的深度过大时,抛出 StackOverflowError 。
  • 线程数过多时,抛出 OutOfMemoryError 。
  • “线程私有”的内存区域。

文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

本地方法栈(Native Method Stacks)

  • 为虚拟机使用到的 Native 方法服务。
  • 栈的深度过大时,抛出 StackOverflowError 。
  • 线程数过多时,抛出 OutOfMemoryError 。
  • “线程私有”的内存区域。

文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

堆(Java Heap)

  • 用于存放对象实例,是JVM占用内存最大一块区域。
  • 垃圾收集器管理的主要区域。
  • 使用分代收集算法时,堆被细分为新生代和老年代,新生代再细分为Eden空间、 From Survivor 空间、 To Survivor 空间。
  • 在HotSpot虚拟机中,通过-Xmx和-Xms控制堆的大小,通过-Xmn控制新生代的大小。
  • 堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
  • 没有内存完成实例分配时,抛出 OutOfMemoryError 。
  • “线程共享”的内存区域,线程共享的堆中又可能划分出多个线程私有的分配缓存区(Thread Local Allocation Buffer,TLAB)。

文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

方法区(Method Area)

  • 存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码。
  • 回收目标主要是针对常量池的回收和对类型的卸载。
  • 可以选择不实现垃圾收集。
  • 当方法区无法满足内存分配需求时,将抛出 OutOfMemoryError 。
  • JDK6 使用永久代实现方法区。
  • JDK7 中永久代的字符串常量池被移出。
  • JDK8 使用元空间实现方法区。
  • “线程共享”的内存区域。

文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

总结

  • 程序计数器:当前线程所执行的字节码的行号指示器。
  • 虚拟机栈:Java方法执行的内存模型,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
  • 本地方法栈:本地方法执行的内存模型,和虚拟机栈非常相似,其区别是本地方法栈为 JVM 使用到的 Native 方法服务。
  • :用于存储对象实例,是垃圾收集器管理的主要区域。
  • 方法区:用于存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

微信公众号:万猫学社

微信扫描二维码

关注后回复「电子书」

获取12本Java必读技术书籍

快速串讲——JVM内存的区域划分的更多相关文章

  1. JVM内存各个区域分工简单介绍

    JVM内存各个区域简单介绍: 程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 在使用多线程时,为了线程切换后能恢复到正确的执行位置,每条线程都需要有个独立 ...

  2. JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM ...

  3. 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

    注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 ...

  4. java内存区域,jvm内存各个区域详解

    一.运行时数据区域 1.如图所示,可分为如下几个区域. 2.程序计数器 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变这个计数器的 ...

  5. JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

    以下内容转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29632145&id=4616836 jvm区域总体分两 ...

  6. JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释(转)

    jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...

  7. JVM内存区域划分Eden Space,Survivor Space,Tenured Gen,Perm Gen

    jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...

  8. [转]JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

    jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...

  9. JVM 运行时数据区域划分

    目录 前言 什么是JVM JRE/JDK/JVM是什么关系 JVM执行程序的过程 JVM的生命周期 JVM垃圾回收 JVM的内存区域划分 一.运行时数据区包括哪几部分? 二.运行时数据区的每部分到底存 ...

随机推荐

  1. "mysql第一次查询很慢,以后就很快"的解决方案

    背景 有个项目使用的mysql数据库,第一次查询很慢,大约15s左右出结果,再次查询就很快了. 分析 后面变快的原因是mysql有缓存机制,但是过上一段时间不使用缓存会过期,我个人测了一下2~3分钟一 ...

  2. Redis内存——内存消耗(内存都去哪了?)

    最新:Redis内存--三个重要的缓冲区 最新:Redis内存--内存消耗(内存都去哪了?) 最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 更多文章... ...

  3. Zabbix 5.0 优化建议

    Blog:博客园 个人 在使用Zabbix过程中,正确的调整Zabbix系统,使之保持高性能是非常重要的,能够充分利用硬件资源,监控更多主机和性能指标. 硬件 关于zabbix server端硬件的建 ...

  4. Beta——事后分析

    事后总结 NameNotFound 团队 项目 内容 北航-2020-软件工程(春季学期) 班级博客 要求 Beta事后分析 课程目标 通过团队合作完成一个软件项目的开发 会议截图 一.设想和目标 软 ...

  5. Java 正则表达式实例操作

    Regular Expression正则表达式,简称RegExp,常规通用的表达式,在多个开发语言中都有它的实现,可以通过正则表达式来快速的检索.匹配.查找.替换字符串中的文本. 简单实例 匹配网址 ...

  6. 阿里云上安装 OpenStack 是什么体验

    阿里云上跑火车(安装 OpenStack Train 版本),猜猜最终花了多少钱? 前言 前面给大家提供了用虚拟机安装 OpenStack 的镜像,虽然已经很简便了,但还是略显笨重.一来镜像文件比较大 ...

  7. 关于UCOSII的学习资料

    UCOSII学习资料: 在战舰的A盘资料包中 ->软件资料->ucosii 有一个叫做简易OS讲解的文档,此文从简单的OS将其,通俗易懂的讲解大体的OS运行原理,任务调度的实现过程,是入门 ...

  8. C语言规范:C89、C90、C95、C99

    本文转载 [K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版 ...

  9. 统信UOS - 扩展系统盘

    一.开root权限,开终端 二.执行lsblk指令,查看磁盘情况 可以发现 / 路径 对应的是loop0,查阅可知loop设备就是一个文件,挂载为一个路径操作的,这就尴尬了,好好的分区不用,你干嘛这么 ...

  10. [leetcode] (周赛)868. 二进制间距

    868. 二进制间距 读懂题意就出来了 class Solution { public int binaryGap(int N) { String s = Integer.toBinaryString ...