JVM堆空间用途分析与划分依据
在上一次【https://www.cnblogs.com/webor2006/p/9876493.html】已经对JVM的内存空间的划分进行了理论化的学习,这次还是对上一次提到的理论进行进一步的补充,纯知识巩固,先来回顾一下上节JVM整个内存都由哪些构成:

下面则按照上述提到的顺序过一下:
虚拟机栈:
回顾一下上节做的笔记:

知识补充:
一个虚拟机栈它本身是归属于一上特定的线程的,换言之它是属于线程私有的内存空间。当线程开始运行的时候,与之相关的虚拟机栈就诞生了,而当线程消亡了,与之对应的虚拟机栈也就消失不见了。虚拟机栈里面的数据则为栈帧(Stack Frame),它主要是用来存储与线程操作相关的一些具体数据或者是数据结构,如之前学习的操作数栈、局部变量表,方法的出入口等,里面可以存放基本数据类型,也可以存放其引用类型(注意:引用类型不是对象!),引用类型是存储在局部变量表中,也就是放在栈帧里面的,也就是属于虚拟机栈。而对于虚拟机栈会存在StackOverFlow异常【之后会用代码来瞅一下】,也有可能出现OutOfMemory异常【但极少会出现】。
程序计数器:
回顾一下上节做的笔记:

知识补充:
它跟虚拟机栈也类似,也是属于线程私有的数据结构。在多线程的环境下,但是在同一时刻肯定只会有一个线程在执行,只是按照时间片的方式来切换线程就感觉是多个线程同时在执行一样,这里有这么一个问题:当一个线程执行到一半的时候核心切到了第二个线程了,势必要记录当前线程要挂起到什么位置上,此信息就是记录在程序计数器上的,而每一个程序计数器里面的线程执行的信息其实是线程私有的,也就是说A线程是不能得到B线程的程序计数器的。如果一个程序正在执行某一个Java方法,程序计数器记录的就是正在执行字节码对应的地址而已。
所以要记住:虚拟机栈和程序计数器是线程不共享的!
本地方法栈:
回顾一下上节做的笔记:

知识补充:
本地方法栈的主要结构其实跟虚拟机栈的结构类似,它们本质上没有特别大的区别,有些虚拟机会将本地方法栈和虚拟机栈合二为一,最典型的就是oracle的haspot虚拟机。同样它也有可能会出现StackOverFlow栈异常。
堆(Heap):
回顾一下上节做的笔记:

知识补充:
这块也是未来要花重点来透彻理解和研究的,堆内存上的对象是被所有线程所共享的,与堆相关的一个重要概念就是垃圾收集器【未来会详细来学习的】,现在几乎所有的垃圾收集器都是采用的分代收集算法,所以,堆空间也基于这一点进行了相应的划分:新生代和老年代【基本上都听说它,但也仅仅听说过】,而与之相关的还有这三个概念:Eden空间、From Survivor空间和To Survivor空间。关于新生代和老年代这里稍加解释一下,在未来会详细学习的,“一般”情况下创建了一个对象,该对象就会进入到了新生代了,新生代也是内存的一个区域,过了一段时间之后GC会对堆上的内存进行回收,由于该对像还能被GC ROOT所引用所以这一次的GC就没有被回收,接着又过一段时间GC执行该对象还是能被GC ROOT所引用所以还是木有被回收,第三次当GC又尝试进行回收该对象还是没能被回收,有可能出现了五次之后,此对象就会晋升到老年代,所谓老年代就是指里面的对象存活的比较久,而老年代垃圾回收的频率肯定是要比新生代要低很多的。
另外JVM对于Java的堆空间而言,这个空间在物理内存既可以是连续存放的,也可以是不连续的,
方法区(Method Area):
回顾一下上节做的笔记:

知识补充:
如上面描述它是用来存储元信息的,而元信息可以指类对象的基本信息、常量的一些信息等。其中说到永久代是很少会被回收的,但是不是说在方法区中的内存是不会被回收的,比如当类被卸载了相应的方法区的内存也就被回收的,只是这种情况出现得较少而已。
运行时常量池:
回顾一下上节做的笔记:

这个比较熟悉了,没啥可补充的了。
直接内存(Direct Memory):
回顾一下上节做的笔记:

知识补充:
其实这部分是跟Java NIO【关于这块还不太熟悉,待未来学习时再来体会】密切相关的,JVM通过堆上的DirectByteBuffer来操作直接内存,所以效率是比较高的。
以上相当于是对上一次知识的复习巩固,虽说枯燥但是很重要!!
JVM堆空间用途分析与划分依据的更多相关文章
- 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
转载注明:http://dwz.win/gHc 最近网上出现一个美团面试题:"一个线程OOM后,其他线程还能运行吗?".我看网上出现了很多不靠谱的答案.这道题其实很有难度,涉及的知 ...
- JVM 堆内存溢出后,其他线程是否可继续工作
最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”.我看网上出现了很多不靠谱的答案.这道题其实很有难度,涉及的知识点有jvm内存分配.作用域.gc等,不是简单的是与否的问题. 由于 ...
- 面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
来源:http://sina.lt/gqaM 最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”.我看网上出现了很多不靠谱的答案.这道题其实很有难度,涉及的知识点有jvm内存分配. ...
- JDK8中JVM堆内存划分
一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比 ...
- 深入了解java虚拟机(JVM) 第三章 内存区域----堆空间
一.堆的含义 jvm堆的区域主要是用来存放对象的实例,它的空间大小是JVM内存区域中占比重最大的,也是jvm最大的内存管理模块,最重要的是,这个区域是垃圾收集器主要管理的区域,这意味着我们在考虑垃圾回 ...
- Java堆空间的划分:新生代、老年代
参考链接:Java堆空间的划分:新生代.老年代
- JVM 调优测试 之 故意分配小的堆空间,观察gc回收打印的内容
测试代码如下: @Test public void testPrintGcDetail(){ HashMap<String, List> gcMap = new HashMap<&g ...
- 一次完整的JVM堆外内存泄漏故障排查记录
前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...
- 【转】JVM 堆内存设置原理
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
随机推荐
- golang中sync.RWMutex和sync.Mutex区别
golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能. type Mutex f ...
- 14、OpenCV实现图像的空间滤波——图像锐化及边缘检测
1.图像锐化理论基础 1.锐化的概念 图像锐化的目的是使模糊的图像变得清晰起来,主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反.而且从算子可以看出来,平滑是基于对图像领域的加 ...
- js复制json对象
var newJson = JSON.parse(JSON.stringify(json对象));
- PAT(B) 1093 字符串A+B(Java和C)
题目链接:1093 字符串A+B (20 point(s)) 题目描述 给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集.要求先输出 A,再输出 B,但重复的字符必须被剔除. 输 ...
- nohup 命令
nohup command > myout.file 2>&1 & 指定nohup.out的文件名 jobs -l 查看后台命令
- 记一次构建SaaS平台项目失败后的反思(收集的客户需求太少,且没有区分重点,闭门造车。技术演变要渐进)
记一次构建SaaS平台项目失败后的反思 前言: 笔者从2017年起开始着手将公司现有的软件系统改造成多租户模式,以降低整个系统的运营成本.但最后这个项目以失败告终.今天,我将对这个SaaS项目是如何走 ...
- Windows下的Android Studio环境搭建、安装使用
https://jingyan.baidu.com/article/20b68a88ff2ca4796cec6232.html https://blog.csdn.net/jklinux/articl ...
- mongodb入门基本语法
show dbs 查看所有数据库列表 二. 创建数据库 使用数据库. 创建数据库 use student 如果真的想把这个数据库创建成功, 那么必须插入一个数据. 数据库中不能直接插入数据,只能往集合 ...
- Go 操作 Mysql(一)
关于 Go 的标准库 database/sql 和 sqlx database/sql 是 Go 操作数据库的标准库之一,它提供了一系列接口方法,用于访问数据库(mysql,sqllite,oralc ...
- alt和title的区别
alt是html标签的属性,而title既是html标签,又是html属性. 在图像标签img中,除了常用的宽度width和高度height属性之外,还有两个比较重要并且也会用到的属性,就是alt和t ...