在之前已经对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. godot新手教程1[button信号使用]<godot节点信号对照及节点属性用法>

    button(按钮)节点信号对照: 1:pressed()      #按钮点击信号 #绑定按钮点击后触发信号 Pressed使用案例: func _on_”节点路径”_Button_pressed( ...

  2. Direct2D 学习笔记(3)图层 Layer

    利用图层Layer绘制资源网址:https://docs.microsoft.com/zh-cn/windows/win32/direct2d/direct2d-layers-overview   1 ...

  3. 解决 Ceph v14.2.1 RGW使能压缩时遇到不生效的问

    根据常规方法部署Ceph(14.2.1 or 14.2.2)集群+rgw后,通过命令“radosgw-admin zone placement modify --rgw-zone=default -- ...

  4. sql语句中,取得schema中的所有表信息及表的定义结构

    postgressql下'検索スキーマの中で.全てテーブルselect tablename from pg_tables where schemaname='test' mysql下'検索スキーマの中 ...

  5. Zookeeper开源客户端Curator之事件监听详解

    Curator对Zookeeper典型场景之事件监听进行封装,提供了使用参考.这篇博文笔者带领大家了解一下Curator的实现方式. 引入依赖 对于Curator封装Zookeeper的典型场景使用都 ...

  6. subplot()一个窗口画多个图

    import matplotlib.pyplot as plt plt.subplot(m,n,p) m,n表示一个窗口上显示m行n列 p表示正在处理第p个区域的部分(区域编号从左到右,从上到下) f ...

  7. Vmware中安装的Ubuntu不能全屏问题解决

    现在有了开源的vmtoll可以下载:open-vm-tools   先安装open-vm-tools:sudo  apt-get install open-vm-tools   然后安装:(不知道具体 ...

  8. (六)Cookie 知识点总结 (来自那些年的笔记)

    如果你想要转载话,可不可以不要删掉下面的 作者信息 呀!: 作者:淮左白衣 写于 2018年4月18日18:47:41 来源笔者自己之前学javaWeb的时候,写的笔记 : 目录 如果你想要转载话,可 ...

  9. PAT甲级 图 相关题_C++题解

    图 PAT (Advanced Level) Practice 用到图的存储方式,但没有用到图的算法的题目 目录 1122 Hamiltonian Cycle (25) 1126 Eulerian P ...

  10. [MA] 有关 Likelihood

    当提到 Linear Regression 或是 Logistic regression 等关键词时,都会涉及一个概念,叫做 Likelihood Function 以及 Maximum Likeli ...