在之前已经对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内存空间划分与作用详解的更多相关文章

  1. JVM内存空间划分与作用

    虚拟机栈:Stack Fame 栈桢 程序计数器(Program Counter): 本地方法栈:主要用于处理本地方法 堆(Heap): JVM管理的最大一块内存空间 方法区(Method Area) ...

  2. java虚拟机内存区域的划分以及作用详解

    序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什 ...

  3. js内存空间及this关键词详解

    http://mp.weixin.qq.com/s/FYFepXmkzzDYNLKhpovYFA

  4. JVM垃圾回收算法及回收器详解

    引言 本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Pyth ...

  5. Linux(centos)系统各个目录的作用详解

    Linux(centos)系统各个目录的作用详解 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码 ...

  6. linux(CENTOS)系统各个目录的作用详解

    Linux(CentOS)系统各个目录的作用详解 文件的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.S ...

  7. JVM内存区域划分及垃圾回收

    第一部分.闲扯+概述 近来在研读<深入理解java虚拟机>一书,读完之后做个小结,算是记录一下自己的学习所得,在成长的路上,只能死磕. 要理解JVM,就要先从其内存区域划分开始,知道其由几 ...

  8. c++中内存拷贝函数(C++ memcpy)详解

    原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明 ...

  9. jsp九大内置对象和其作用详解

    jsp九大内置对象和其作用详解 JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.p ...

随机推荐

  1. 一次Python爬虫的修改,抓取淘宝MM照片

    这篇文章是2016-3-2写的,时隔一年了,淘宝的验证机制也有了改变.代码不一定有效,保留着作为一种代码学习. 崔大哥这有篇>>小白爬虫第一弹之抓取妹子图 不失为学python爬虫的绝佳教 ...

  2. WebStorm+Chrome调试Vue步骤

    在调试时请 注意 : 在WebStorm中启动调试时,WebStorm会根据你设置的url,自动打开新的Chrome浏览器进程访问这个设置的url,而且这个浏览器页面和你平常看到的浏览器差异会比较大, ...

  3. FCM实现手机推送,推送的方式,真机调试

    FCM实现手机 1 下载Androidstudio 3.2 版本,之后新建一个项目 2  创建完项目之后查找文件AndroidMainifest.xml 3  访问网站注册一个自己的firebase的 ...

  4. 利用Python进行数据分析_Pandas_层次化索引

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 层次化索引主要解决低纬度形式处理高纬度数据的问题 import pandas ...

  5. 创客课堂——Scratch实例演示

    大家好,这里是蓝精灵创客公益课堂,我是蓝老师. 前两期我们认识了Scratch的界面和菜单功能,本期我们就可以根据提示的步骤,学习一些Scratch的基本操作. 下面就开始今天学习内容 一.开始移动 ...

  6. Spring框架ioc概括

    什么是Spring且能做什么 Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的. Spring使用基本的JavaBean来完成以前只可能由EJB完成 ...

  7. 深度挖坑:从数据角度看人脸识别中Feature Normalization,Weight Normalization以及Triplet的作用

    深度挖坑:从数据角度看人脸识别中Feature Normalization,Weight Normalization以及Triplet的作用 周翼南 北京大学 工学硕士 373 人赞同了该文章 基于深 ...

  8. 整理下线段树吧 poj hotel

    除了上次的新学的有 区间更新 延迟更新  区间合并 先说下区间更新以及延迟更新吧 既然是对区间的维护 在求解一些问题的时候 有的时候没有必要对所有的自区间都进行遍历 这个时候 延迟标记就派上用场了 ( ...

  9. Citrix ADC 12.1 / NetScaler 12

    Citrix ADC 12.1 / NetScaler 12 参考 https://www.carlstalhood.com/netscaler-menu/netscaler-12/ Core – C ...

  10. datagrid行内编辑

    编辑属性 :editor: { type: 'text'} $('#listShow').datagrid({ height : 478, pagesize : 20, pageList : [20, ...