在上一次【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堆空间用途分析与划分依据的更多相关文章

  1. 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    转载注明:http://dwz.win/gHc 最近网上出现一个美团面试题:"一个线程OOM后,其他线程还能运行吗?".我看网上出现了很多不靠谱的答案.这道题其实很有难度,涉及的知 ...

  2. JVM 堆内存溢出后,其他线程是否可继续工作

    最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”.我看网上出现了很多不靠谱的答案.这道题其实很有难度,涉及的知识点有jvm内存分配.作用域.gc等,不是简单的是与否的问题. 由于 ...

  3. 面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    来源:http://sina.lt/gqaM 最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”.我看网上出现了很多不靠谱的答案.这道题其实很有难度,涉及的知识点有jvm内存分配. ...

  4. JDK8中JVM堆内存划分

    一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比 ...

  5. 深入了解java虚拟机(JVM) 第三章 内存区域----堆空间

    一.堆的含义 jvm堆的区域主要是用来存放对象的实例,它的空间大小是JVM内存区域中占比重最大的,也是jvm最大的内存管理模块,最重要的是,这个区域是垃圾收集器主要管理的区域,这意味着我们在考虑垃圾回 ...

  6. Java堆空间的划分:新生代、老年代

    参考链接:Java堆空间的划分:新生代.老年代

  7. JVM 调优测试 之 故意分配小的堆空间,观察gc回收打印的内容

    测试代码如下: @Test public void testPrintGcDetail(){ HashMap<String, List> gcMap = new HashMap<&g ...

  8. 一次完整的JVM堆外内存泄漏故障排查记录

    前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...

  9. 【转】JVM 堆内存设置原理

    堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...

随机推荐

  1. STM32驱动模数转换芯片ADS1120(基础知识篇)第1篇

    1. 先看下ADS1120的结构图,ADS1120是个比较奇葩的ADC模数转换器,因为比较适用于热电阻之类的温度采集器.看下图,有个MUX多路复用器,应该是选择两个差分信号去测试,通过输入多路复用器 ...

  2. logstash 6.6.0 读取nginx日志 插入到elasticsearch中

    logstash.conf input { # For detail config for log4j as input, # See: https://www.elastic.co/guide/en ...

  3. Freemarker讲解

    FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP.它不仅可以用作表现层的实现 ...

  4. Java的设计模式(7)— 生产者-消费者模式

    生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解决方案.这个模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程.生产者线程负责提交用户请求,消费者线程则负责具体 ...

  5. Git学习记录(一)

    本篇文章介绍Git的本地使用 Git是什么? Git是世界上最先进的分布式版本控制系统. 那么什么是版本控制系统? 我们来举个例子,假设我创建了一个项目Project.1,里面写了一个README.t ...

  6. 【Linux】一步一步学Linux——Linux版本(03)

    目录 00. 目录 01. Linux内核版本 02. Linux内核官方网站 03. Linux发行版本 04. Linux发行版本介绍 4.1 Ubuntu 4.2 RedHat 4.3 Debi ...

  7. CentOS6.8 克隆

    克隆 克隆前,先将上面安装好并且设置好的系统关机 (1) 右键centos -->管理->克隆->下一步->下一步->完整克隆 ->克隆名称起名有意义点就行-> ...

  8. ES6语法基本使用

    什么是ES6? ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2. ...

  9. maven一些简单常用却容易记混的命令参数-U -e -B

    install 命令完成了项目编译.单元测试.打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程Maven私服仓库: deploy 命令完成了项目 ...

  10. 在论坛中出现的比较难的sql问题:18(字符合并 整数解析星期几)

    原文:在论坛中出现的比较难的sql问题:18(字符合并 整数解析星期几) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...