JVM内存简单总结

Stella981
• 阅读 434

  根据自己的认识,简单总结下Java中的数据存储及内存分析。
  Java中的内存大致可以分为三块:栈内存、堆内存、方法区内存,看图说话。

JVM内存简单总结

  1)、栈

  栈(stack):栈是限定仅在表头进行插入和删除操作的线性表。栈作为一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。在Java中,栈则是一个具有以上属性的动态内存区域。

  通常在栈中执行各种方法(包括main(...)方法):首先通过方法区内存将方法通过压栈形式压入栈中进行执行(有先后顺序)。栈中存储基本数据类型和引用数据类型的地址--局部变量。还有就是栈是线程独享的,每一个线程都有自己的线程栈,所以栈可以有多个。JVM是基于栈的虚拟机,JVM为每个新创建的线程都分配一个栈。也就是说,对于一个Java程序来说,它的运行就是通过对栈的操作来完成的。栈以帧为单位保存线程的状态。JVM对栈只进行两种操作:以帧为单位的压栈和出栈操作。我们知道,某个线程正在执行的方法称为此线程的当前方法,我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的Java栈里新压入一个帧。这个帧自然成为了当前帧,在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据。从Java的这种分配机制来看,栈又可以这样理解:栈是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。

  2)、堆

  堆(heap):堆是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆中某个节点的值总是不大于或不小于其父节点的值,且堆总是一棵完全二叉树。

  每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享。跟C/C++不同,Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配。也就是说,在建立一个对象时,从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在栈中分配的内存实际上只是一个指向这个堆对象的引用而已。
  3)、方法区
  方法区(Method Area):线程共享,存储已经被JVM加载的类信息、常量、静态变量、编译后的代码等等。

  通常方法区里面包括JVM已加载的类信息和运行时常量池。JVM已加载的类信息包括:类型信息、类型的常量池(存放该类型所用到的常量的有序集合,包括直接常量【如:字符串、整数、浮点数的常量】和对其他类型,字段,方法的符号引用)、字段信息(字段修饰符、字段的类型、字段名称)、方法信息(方法修饰符、方法返回类型、方法名、方法参数【个数,类型,顺序】、方法字节码)、类变量(静态变量)、指向类加载器的引用(每一个被JVM加载的类型,都保存这个类加载器的引用,类加载器动态链接时会用到)、指向Class实例的引用(类加载的过程中,虚拟机会创建这个类型的Class实例,方法区中必须保存对该对象的引用。通过类名.class.forName(String className)来查找获得该实例的引用,然后创建该类的对象)。

  运行时常量池:Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面常量和符号引用,这部分内容被类加载后进入方法区的运行时常量池中存放。运行时常量池相对于Class文件常量池的另外一个特征具有动态性,可以在运行期间将新的常量放入池中。

点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
1个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
晴空闲云 晴空闲云
1个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。 盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
> MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
JVM内存区域划分
JVM内存区域划分 ========= 一、JVM运行时数据区划分 ------------- * * * 根据《Java虚拟机规范》JVM会把它管理的内存划分为若干个不同的数据区域,如下图所示:**方法区、堆、栈(虚拟机栈、本地方法栈)、程序计数器**。线程私有的意思是指,JVM每遇到一个新的线程就会为他们分配栈和程序计数器。 ![](https
Wesley13 Wesley13
1年前
JDK8中JVM堆内存划分
一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址。 JVM全部的对象信息都 存放在堆内存中。相比栈内存,堆内存能够所大的多,所以JVM一直通过对堆内存划分 不同的功能区块实现对堆内存中对象管理。 堆内存不够最常见的错误就是**OOM(OutOf
Stella981 Stella981
1年前
Android 优化二 Java内存分配机制及内存泄漏
**Java内存分配机制及内存泄漏** **目录介绍** * **1.JVM内存管理** * 1.1 JVM内存管理图 * 1.2 Java采用GC进行内存管理。 * **2.JVM内存分配的几种策略** * 2.1 静态的 * 2.2 栈式的 * 2.3 堆式的 * 2.4 堆和栈的区别 * 2.5 得出结论 *
Wesley13 Wesley13
1年前
java 内存管理 堆和栈的理解
在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题。 一般,JVM的内存分为两部分:Stack和Heap。 Heap(堆)是JVM的内存数据区。Heap 的管理很复杂,每次分配不定长的内存空间,专门用来保存对象
Wesley13 Wesley13
1年前
java的内存机制
Java 把内存划分成两种:一种是栈内存,另一种是堆内存。   Heap(堆) Stack(栈) JVM中的功能 内存数据区 内存指令区 存储数据 对象实例 基本数据类型, 指令代码,常量,对象的引用地址 ### 堆中存储数据 **堆内存用来存放由 new 创建的对象和数组。** 保存对象实例,实际上是保存对象实例的属性值,属性的类型和
helloworld_28799839 helloworld_28799839
1个月前
常用知识整理
# Javascript ## 判断对象是否为空 ```js Object.keys(myObject).length === 0 ``` ## 经常使用的三元运算 > 我们经常遇到处理表格列状态字段如 `status` 的时候可以用到 ``` vue