iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >JAVA虚拟机(JVM)详细讲解(二)——内存的划分
  • 853
分享到

JAVA虚拟机(JVM)详细讲解(二)——内存的划分

java教程JVM 2020-08-19 22:08:06 853人浏览 绘本
摘要

我们知道,在c++语言里,如果想使用一个对象,需要对其进行new操作;如果不用这个对象了,需要对其进行delete操作。一旦开发人员忘记写delete语句了,就会造成内存泄露。【内存被对象占用着不还,就叫内存泄露。】而java就聪明了,它从

我们知道,在c++语言里,如果想使用一个对象,需要对其进行new操作;如果不用这个对象了,需要对其进行delete操作。一旦开发人员忘记写delete语句了,就会造成内存泄露。【内存被对象占用着不还,就叫内存泄露。】

而java就聪明了,它从“手动”进化成了“自动”,把内存的控制权力交给了虚拟机。下面我们就来窥探一下JVM是怎么进行自动内存管理的。

20190618160941259.png

自动内存管理分为两部分

给对象分配内存和回收分配给对象的内存。在本篇我们说说前者,也就是内存划分和内存分配。下篇再说GC(垃圾回收)。

1、内存划分

我们来看看虚拟机内存里都有什么东西。JVM的内存区域大致分为Class文件、类装载子系统、运行时数据区、执行引擎。今天我们只说说运行时数据区。【这张图是基于jdk7的。JDK7以前,常量池是存放在方法区的。从JDK7以后,常量池放到了堆中。】

20190618154647817.png

线程公有

在运行时数据区中,方法区和堆是属于线程公有的,也就是这两块区域是“循环利用”的,所以要对其进行垃圾回收。其是在虚拟机启动时创建。

线程私有

虚拟机栈、本地方法栈、程序计数器是属于线程私有的,其与线程“同生死”,属于“一次性”的,所以不用对其进行垃圾回收。

(一)方法区

存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
其中有一个运行时常量池。其存储的是Class文件中描述的符号引用,直接引用。在编译期和运行期都可以将新的常量放入此池子中。

(2) 堆

概念:如果说栈解决的是程序运行问题,即程序如何处理数据;则堆解决的是数据存储问题,即数据怎么放,放在哪。

特点:

a、堆是虚拟机内存中最大的一块,大概占内存的四分之三。比如一个32位windows平台中每个进程有2GB的内存,则一般将1.5GB的内存划分给堆。可见堆的所占空间之大。
b、可处于物理上不连续的内存空间中,只要逻辑上是连续的即可。

作用:

存放对象实例,几乎所有的对象实例都在这里分配内存。

分类:

从内存回收的角度看,分为新生代和老年代。
从内存分配的角度看,可划分出多个线程私有的分配缓冲区。

(3)虚拟机栈

虚拟机栈里面存储的是栈帧,栈帧里面存储的是局部变量表,操作数栈,动态链接,方法出口等信息。

20190618170100488.png

栈中的栈帧

每个方法在执行的同时都会创建一个栈帧,一个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

栈帧中的局部变量表

存放的是编译期可知的各种基本数据类型,对象引用,returnAddress类型。所以其所需的内存空间在编译期间就能完成分配,在运行期间不会改变其大小。

在分配基本数据类型所占的空间时,除了64位的long和double类型的数据会占用2个局部变量空间,其余的数据类型只占用1个。

(4)本地方法栈

本地方法栈和虚拟机栈的作用是相同的,只不过虚拟机栈执行的是java方法,本地方法栈执行的是Native方法。
java方法就是开发人员写的java代码,Native方法就是一个java调用非java代码的接口。

(5)程序计数器

程序计数器中存放的是当前线程所执行的字节码的行号。jvm工作时,就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

2、内存分配

这部分我们说说对象在java堆中是如何分配,布局和访问的,以及内存分配的原则。

对象的创建

我们用new来创建对象,来看看系统运行到new时,虚拟机在干什么。此时的类就像一块肉,他要经过层层安检,才能到达人类的饭桌。第一步:查看在常量池中是否有对应的符号引用。【在方法区中进行】

第二步:查看此类是否被加载,解析和初始化过。【在方法区中进行】

第三步:领取新生对象的内存。有两种方式:指针碰撞和空闲列表。【在堆中进行】

第四步:将分配到的内存空间初始化为零值。

第五步:对对象进行必要的设置,比如其是哪个类的实例,对象的哈希码之类的。这些信息存放在对象的对象头之中

第六步:如果java代码中对对象进行了赋初值,则会进行第六步:执行< init >方法。此方法的作用就是对对象进行初始化。

对象的内存布局

对象在内存中的存储布局分为3部分:对象头+实例数据+对齐填充

对象头

对象头里面有两部分信息:

(1)运行时数据,包括哈希码,GC分代年龄,状态标志等。

(2)类型指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

实例数据

实例数据中存放的是代码中定义的各种类型的字段内容。

对齐填充

对齐填充起的是占位符的作用,不是必然存在的。其只要保证对象的大小是8字节的整数倍即可。

对象的访问定位

建立完对象后,我们就可以使用对象了。在使用时,怎么才能找到想找的对象?有两种方式:句柄和直接指针

句柄:

句柄访问就是在java堆中划分出一块内存来作为句柄池,句柄中包含了对象实例数据和类型数据各自具体的地址信息。

20190618201352170.png

直接指针:

直接指针之所以“直接”,是因为它去除了句柄这个中介。所以在速度上比句柄快。在HotSpot虚拟机中,使用的是这种方式。

20190618201408896.png

说完了对象在java堆中是如何分配,布局和访问的,接下来我们说说内存分配的原则

内存分配的原则:

20190618202533861.jpg

堆大致分为新生代,老年代,永久代。对象的内存分配主要分配在新生代的Eden区,少数情况下会直接分配到老年代中。分配的规则不是100%固定的,取决于垃圾收集器组合和参数设置等。下面有几条分配原则可供参考。

(1)对象优先在Eden分配。

(2)大对象直接进入老年代。

(3)长期存活的对象将进入老年代。

(4)动态对象年龄判定。

(5)空间分配担保。

以上便是JAVA虚拟机中关于内存的划分部分,更多问题请访问PHP中文网:JAVA视频教程

--结束END--

本文标题: JAVA虚拟机(JVM)详细讲解(二)——内存的划分

本文链接: https://www.lsjlt.com/news/3027.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java虚拟机内存区域划分详解
    在谈 JVM 内存区域划分之前,我们先来看一下 Java 程序的具体执行过程,我画了一幅图。 Java 源代码文件经过编译器编译后生成字节码文件,然后交给 JVM 的类加载器,加载...
    99+
    2024-04-02
  • JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)
    JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型。如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。...
    99+
    2023-08-30
    jvm GC 直接内存 jvm性能调优
  • java内存模型jvm虚拟机简要分析
    目录主内存和工作内存内存间的交互操作原子性、可见性、有序性原子性可见性有序性主内存和工作内存 Java 内存模型规定了所有的变量都存储在主内存中, 每条线程有自己的工作内存...
    99+
    2024-04-02
  • 深入理解Java虚拟机 JVM 内存结构
    目录前言JVM是什么JVM内存结构概览运行时数据区程序计数器Java虚拟机栈本地方法栈方法区运行时常量池Java堆直接内存前言 JVM是Java中比较难理解和掌握的一部分,也是面试中...
    99+
    2024-04-02
  • Java JVM虚拟机调优详解
    目录jmap查看内存信息jstackjinfo查看jvm系统参数Jstat查看堆内存使用和类加载的数量信息内存泄漏jmap查看内存信息 jmap histo /pid > ./...
    99+
    2024-04-02
  • java虚拟机之JVM调优详解
    目录JVM常用命令行参数1. 查看参数列表2. 基本参数说明:3. 扩展参数说明:虚拟机参数分类什么是调优1.调优步骤:2.调优案例2.1案例一2.2案例二JVM优化总结JVM常用命...
    99+
    2024-04-02
  • JVM内存区域划分相关原理详解
    JVM内存区域划分是指将JVM中的内存划分为不同的区域,每个区域有不同的用途和管理方式。JVM内存区域的划分主要有以下几个方面:1....
    99+
    2023-08-11
    JVM
  • Java虚拟机中JVM内存结构是怎么样的
    这篇文章给大家分享的是有关Java虚拟机中JVM内存结构是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、JVM启动流程:JVM启动时,是由java命令/javaw命令来启动的。二、JVM基本结构:JV...
    99+
    2023-06-02
  • Java 虚拟机(JVM)之基本概念详解
    1、类加载子系统:负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间。2、方法区:就是存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等。方法区是辅助堆栈的块永久区,解决堆栈信息的产生,是先决...
    99+
    2023-05-31
    java 虚拟机 基本概念
  • 详解Java 虚拟机(第⑥篇)——内存分配与回收策略
    一、Minor GC 和 Full GCMinor GC:回收新生代,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。Full GC:回收老年代和新生代,老年代对象其存活时间长,因此 Full GC...
    99+
    2023-06-05
  • Java虚拟机内存分配与回收策略问题精细解读
    本文参考于《深入理解Java虚拟机》 内存分配与回收策略 Java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存。 1. ...
    99+
    2024-04-02
  • Python超详细讲解内存管理机制
    目录什么是内存管理机制一、引用计数机制二、数据池和缓存什么是内存管理机制 python中创建的对象的时候,首先会去申请内存地址,然后对对象进行初始化,所有对象都会维护在一 个叫做re...
    99+
    2024-04-02
  • Java 虚拟机栈详解分析
    Java虚拟机栈 1. 定义 栈:线程运行时需要的内存空间,一个栈存在多个栈帧。栈具有先入后出,后入先出的特点。 栈帧:每个方法运行时需要的内存(局部变量表、操作数...
    99+
    2024-04-02
  • Android虚拟机中的内存分配与OOM问题详解
    目录背景知识一、Android VM的内存空间1.查看内存的API二、Android VM内存分配流程小结三、出现OOM的建议解决方案背景知识 Android中每个App默认情况下是...
    99+
    2024-04-02
  • java为什么需要虚拟机jvm原理详解
    曾几何时,我们还是初识Hello World的时候,我们哪曾知道,Java这门神奇的语言,在执行我们的代码的时候,不是直接将我们所编写的Java代码交付给操作系统底层进行解析编译,...
    99+
    2024-04-02
  • Java 对象在 JVM 中的内存布局超详细解说
    目录一、new 对象的几种说法二、Java 对象在内存中的存在形式1. 栈帧(Frame)2. 对象在内存中的存在形式 ①3. 对象中的方法存储在那儿?4. Java 对象在内存中的...
    99+
    2024-04-02
  • Java运行时数据区域(内存划分)的深入讲解
    1. 程序计数器(线程私有) 程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器(切换线程后,能恢复到正确的执行位置). 2. Java虚拟机栈(线程私...
    99+
    2024-04-02
  • Java虚拟机内存优化的方法
    这篇文章主要介绍“Java虚拟机内存优化的方法”,在日常操作中,相信很多人在Java虚拟机内存优化的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java虚拟机内存优化的方法”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-17
  • Java虚拟机内存管理该怎么理解
    今天就跟大家聊聊有关Java虚拟机内存管理该怎么理解,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java虚拟机规范将物理内存(主内存和CPU中的缓存、寄存器)划分为程序计数器、Ja...
    99+
    2023-06-02
  • JVM内存管理之JAVA语言的内存管理详解
    引言内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题。可怕的事情还不只...
    99+
    2023-05-31
    jvm 内存管理 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作