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类定 ...
随机推荐
- C# .NET WINFORM MUTEX 互斥
static class Program 里的全局变量: static System.Threading.Mutex appMutex; Main 方法里的内容: string exeName = & ...
- Configuration system failed to initialize
引用:https://cloud.tencent.com/developer/article/1336954 重装.net Framework
- 【VS开发】【OpenGL开发】OpenGL---Windows下配置与第一个OpenGL程序
面记录一下Windows下配置OpenGL与我的第一个OpenGL程序. 第一步:选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Bu ...
- Ansible-Ad_Hoc临时命令的使用
Ad_Hoc临时命令的使用 1.使用场景: 所有的临时获取信息的都可以使用,比如节前健康检查.临时更新配置文件. 2.用法: ansible -i 主机 -m 模块 选项 3.常用的命令选项: -v ...
- LeetCode 590. N叉树的后序遍历(N-ary Tree Postorder Traversal)
590. N叉树的后序遍历 590. N-ary Tree Postorder Traversal 题目描述 给定一个 N 叉树,返回其节点值的后序遍历. LeetCode590. N-ary Tre ...
- 简单实现SpringBoot启动
一.准备: IDEA 使用简单手写导包实现spring boot,未使用idea自带的spring创建方法 可以更加简单理解springboot启动过程 二.开始 1.打开idea创建project ...
- 【已解决】每次打开Excel时会同时打开一个空的Excel表格
每次打开Excel时会同时打开一个空的Excel表格,情况如图. 官方解法如下,本人验证有效: 方法1, 请到以后路径中检查是否存在与空白文件夹同名字的Excel文件,删除它. C:\Users\\A ...
- golang开发:环境篇(四)包管理器 glide的使用
glide 是golang项目开发中是特别重要的软件,没有它,golang的项目可能都无法发布. 为什么要使用glide 平时我们开发Go项目的时候,使用第三方的包的时候都直接使用go get 去获取 ...
- Spring Boot使用@ConfigurationProperties注解获取配置文件中的属性值
注意:这种方式要提供属性的getter/setter方法—— 如果idea报错,提示没有相应的执行器,就需要在maven中添加: (虽然不配置代码也能正常运行,作用在下面会说明) 配置了该执行器后,在 ...
- react 提示消息队列 (支持动态添加,删除,多实例化)
import React from 'react' import PropTypes from 'prop-types' import AnimationOperateFeedbackInfo fro ...