JVM内存空间划分与作用详解
在之前已经对Java的字节码进行了非常详细而又系统的学习了,接下来开启jvm内存相关的新篇章,在一个新知识开头之前肯定得理论化的对其进行一个整体的介绍,所以摒弃浮躁,先来看看相关的理论,主要是看一下JVM内存的相关结构:
虚拟机栈:每一个方法在执行的过程中都会生成一个栈帧(Stack Frame,在之前【https://www.cnblogs.com/webor2006/p/9718062.html】已经有介绍过)这个数据结构。
程序计数器(Program Counter):它占据的空间是比较小的,主要是描述线程执行字节码第一行执行完了之后,下一行字节码在哪。
本地方法栈:主要用于处理本地方法。
堆(Heap):这是JVM所管理最大的内存空间,在Java当中我们都是通用引用来操作对象的,而对象本身是位于堆上面,而引用则是位于虚拟机栈上面,所以引用本身是个变量,所以在Java中一定是通过引用来获取到这个对象然后去操纵它。下面用一个小的示意图来理论引用与对象它们之间的关系。


其实引用指向对象是有两种形态的,上面只是一个粗略的形态,其实在堆中一部份存放的是对象实例本身的数据,另一部分则是元数据(也就是class数据),而元数据只有一份,它是存放在另外一个位置的,该位置叫方法区,如下:

而实际实现第一种形态可能是这样:

而第二种形态可能为:

对于Oracle的Hotspot虚拟机采用的是第二种形态,那对于这二种形态有啥区别呢?其实区别还是挺大的,对于JVM垃圾回收来说,当对像被回收之后可能会造成对象的移动,用个形象的未例图来表述这个移动:



对于对象的移动,假如采用第一种形态,由于是用一个指针来指向对象,所以指针的值也会发生变化,而对于堆内存而言发生垃圾回收的频率是相当之高的,所以该指向变量的指针会频繁发生变化;而如果采用第二种形态则没有这个问题,因为ref是直接指向的对象本身,当对象移动时则ref只是指向的位置会发生变化,值还是一样的,如下:

所以经过对比,也能发现第二种形态会更好,这也是Oracle的Hotspot为啥采用第二种的原因。
方法区(Method Area):存储元信息。我们对于垃圾收集器可能经常会听到一个叫永久代(Permanent Generation)的概念,所以永久代当然就是很少会被回收,所以会将方法区称为永久代,但是从JDK1.8开始,已经彻底废弃了永久代了,使用元空间(Meta Space)代替。
运行时常量池:方法区的一部内容,这个在咱们之前的字节码学习中已经详细学习过。
直接内存:Direct Memory,它并不是由JVM所管理的一块区域,而是由系统所管辖的,只不过是JVM向系统申请了这块内存。
以上是从宏观的角度来审视JVM的内存结构,在之后会结合实践对这些理论进行进一步巩固!
JVM内存空间划分与作用详解的更多相关文章
- JVM内存空间划分与作用
虚拟机栈:Stack Fame 栈桢 程序计数器(Program Counter): 本地方法栈:主要用于处理本地方法 堆(Heap): JVM管理的最大一块内存空间 方法区(Method Area) ...
- java虚拟机内存区域的划分以及作用详解
序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什 ...
- js内存空间及this关键词详解
http://mp.weixin.qq.com/s/FYFepXmkzzDYNLKhpovYFA
- JVM垃圾回收算法及回收器详解
引言 本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Pyth ...
- Linux(centos)系统各个目录的作用详解
Linux(centos)系统各个目录的作用详解 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码 ...
- linux(CENTOS)系统各个目录的作用详解
Linux(CentOS)系统各个目录的作用详解 文件的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.S ...
- JVM内存区域划分及垃圾回收
第一部分.闲扯+概述 近来在研读<深入理解java虚拟机>一书,读完之后做个小结,算是记录一下自己的学习所得,在成长的路上,只能死磕. 要理解JVM,就要先从其内存区域划分开始,知道其由几 ...
- c++中内存拷贝函数(C++ memcpy)详解
原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明 ...
- jsp九大内置对象和其作用详解
jsp九大内置对象和其作用详解 JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.p ...
随机推荐
- 域名购买、SSL证书申请使用和本地服务映射外网
万网购买域名 1.在如下网址购买,价格不是很贵,几块钱一年的都有:https://wanwang.aliyun.com/domain/?spm=5176.100251.111252.24.4ddd4f ...
- markdown语法(测试自用)
Markdown语法主要分为几大部分:标题.段落.区块引用.代码区块.强调.列表.分割线.链接.图片.反斜杠.符号'`' 1.标题 两种形式 1)使用 = 和 - 标记一级标题和二级标题 一级标题 二 ...
- Work? working!
0.总要想想为什要做这个(目的是什么,优缺点,必要性,不用行不行,产品定位,如何保证最后的稳定性) 1.如何逐步排查问题所在(做实验+分析排查:不同的实验手段) 2.如何利用网络(搜索问题的所在,确定 ...
- 网络编程(socket).WinSocket_recvfrom出错,GetLastError()为10054
1.在写 我的Qt598(vs2017)x64版本的 shadowsocks程序时遇到的. 具体问题情况 大概是这样:QUdpSocket(假设是sktA) connect接收函数,sktA侦听 端口 ...
- js类似新闻图片轮换(带有文字介绍,其实可以放任何内容)
js类似新闻图片轮换(带有文字介绍,其实可以放任何内容) 主要是利用style="display:block;" 属性<script language="javas ...
- 通过js操作,将div设置为contenteditable的内容设为全选状态
因为div设置为contenteitable可编辑的文本内容用 select()选择全部内容不生效,所以只能用下列方法: 先 creatTextRange或者 createRange <div ...
- B9 Concurrent 重入锁(ReentrantLock)
[概述] java.util.concurrent.locks.ReentrantLock 实现 java.util.concurrent.locks.Lock 接口,加锁(lock)和 解锁(unl ...
- python学习-44 程序的解耦 (不是特别懂的,回头在复习)
import os def file_handler(backend_data,res=None,type='fetch'): # 查询功能 if type == 'fetch': with open ...
- python学习-20 集合
集合set 1.由不同元素组成的集合,集合是一组无序排列的,集合中的元素必须是不可变的 -定义集合 第一种: jh = {1,2,3,4} print(type(jh),jh) 运行结果: <c ...
- 初始STM32
主要内容: 1.什么是STM32 STM32有什么 STM32怎么选型号 一:什么是STM32 ST— 意法半寻体,是一个公司名,即SOC厂商(ARM是IP厂商,STM32中内核由ARM设计,外设例如 ...