Java 中的 JVM、堆和栈 -- 初步了解
JVM -- Java Virtual Machine(Java虚拟机)
—— 因为要说堆和栈,所以我们必须要先简单的说一下JVM。(JVM详细请找度娘啦~)
首先,我们都知道 java 一直宣传的口号是:一次编译,到处运行。其实它具体的实现是因为 java 程序经过一次编译之后,将 java 代码编译为字节码也就是 class 文件,然后只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。
所以说它是 java 的核心和基础。
个人觉得,它大概的执行过程就是:
① 加载 .class 文件(它也只能加载class文件)
② 管理并分配内存
③ 执行垃圾回收
(emmm..就到这吧。下面才是重点)
JVM 的内存分配 -- JVM 的内存划分为五片,分别是:PC寄存器、方法区、堆、Java栈、本地方法栈
方法区和堆由所有线程共享
Java栈和PC寄存器由线程独享,在新线程的创建的时间里
本地方法栈:存储本地方法调用的状态
下面重点说一下,堆和栈。
堆(Heap)和栈(Stack)
一个简单总结:
栈(stack):空间小,速度比较快, 用来放对象的引用,存取速度比堆要快。
堆(heep): 大,一般所有创建的对象都放在这里。
堆和栈是两种内存分配的两个统称,都是Java用来在Ram中存放数据的地方(java 自动管理栈和堆,程序员不能直接设置)。可能有很多种不同的实现方式,但是实现要符合几个基本的概念:
1. 栈--后进先出。对栈而言,栈中的新加数据项放在其他数据的顶部,移除时你也只能移除最顶部的数据(不能越位获取)。
2. 对堆而言,数据项位置没有固定的顺序。你可以以任何顺序插入和删除,因为他们没有“顶部”数据这一概念。
栈(Stack):栈内存首先是一片内存区域,存储的都是些局部变量(凡是定义在方法中的都是局部变量,方法外的是全局变量)
注意:for 循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量。
变量有自己的作用域(也就是由{...}括起来的区域),一旦离开作用域,变量就会被释放(大概是方法执行完成到方法外面的时候,变量销毁的意思)。栈内存更新速度很快,因为局部变量的生命周期都很短。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。例:
我们同时定义:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a 的引用,然后查找有没有字面值为 3 的地址,没找到,就开辟一个存放 3 这个字面值的地址,然后将 a 指向 3 的地址。接着处理int b = 3;在创建完 b 的引用变量后,由于在栈中已经有 3 这个字面值,便将 b 直接指向 3 的地址。
这样,就出现了 a 与 b 同时均指向 3 的情况。特别注意的是,这种字面值的引用与类对象的引用不同。
堆(Heap):存储的是数组和对象(其实数组就是对象),凡是 new 建立的都是在堆中,堆中存放的都是实体,实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里面存放的都是单个变量,变量被释放了,那就没有了。堆里面的实体虽然不会被释放,但是会被当成垃圾(java的垃圾回收机制会不定时的收取)。
堆和栈的联系:
假设我们现在在主函数里面声明一个数组 int arr = new int[3] ,它现在是没有值的,只是有这么一个数组对象创建在堆里面,然后它有了一个内存地址,并且进行了默认的初始化(未初始化的数据是不能用的,所以在栈里面不能用,堆里面能用,就是因为默认初始化过了)。
然后栈里面存放的只是堆内存地址(对象的引用),而不是这个 arr 数组的这个实体。我们通过栈里面的这个地址指向 arr 数组这个实体,进行操作。
当 arr 被置为 null ,也就是没有任何指向引用。arr 这时候当做一个垃圾,不定时的时间内自动回收(java 自动回收机制)。
堆与栈的区别:
1.栈内存存储的是局部变量而堆内存存储的是实体;
2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。
4.栈是后进先出的,拿的是顶部的数据。而堆没有顶部的概念。
Java 中的 JVM、堆和栈 -- 初步了解的更多相关文章
- Java基础-JVM堆与栈
首先看一个解析列子 JVM的内存空间: (1). Heap 堆空间:分配对象 new Student() (2). Stack 栈空间:临时变量 Student stu (3).Code 代码区 :类 ...
- java 中 heap(堆)和stack(栈)的区别
总结在Java里面Heap和Stack分别存储数据的不同. 区别项 Heap(堆) Stack(栈) JVM中的功能 内存数据区 内存指令区 存储数据 对象实例(注1) 基本数据类型, 指令代码,常量 ...
- java内存管理(堆、栈、方法区)
java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉 ...
- Java内存分配之堆、栈和常量池
Java内存分配主要包括以下几个区域: 1. 寄存器:我们在程序中无法控制 2. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 3. 堆:存放用new产生的数据 4. 静 ...
- Java内存分配之堆、栈和常量池(转)
摘录自http://www.cnblogs.com/SaraMoring/p/5687466.html Java内存分配主要包括以下几个区域: 1. 寄存器:我们在程序中无法控制 2. 栈:存放基本类 ...
- JVM堆和栈的区别
物理地址 堆的物理地址分配对对象是不连续的.因此性能慢些.在GC的时候也要考虑到不连续的分配,所以有各种算法.比如,标记-消除,复制,标记-压缩,分代(即新生代使用复制算法,老年代使用标记--压缩) ...
- JVM 堆和栈的区别
栈内存: 程序在栈内存中运行 栈中存的是基本数据类型和堆中对象的引用 栈是运行时的单元 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据 一个线程一个独立的线程栈 ...
- java中对JVM的深度解析、调优工具、垃圾回收
jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工 ...
- 【转】jvm 堆内存 栈内存 大小设置
原文地址:http://blog.csdn.net/qh_java/article/details/46608395 4种方式配置不同作用域的jvm的堆栈内存! 1.Eclise 中设置jvm内存: ...
随机推荐
- pandas 操作 excel
1. 多重 sheet Using Pandas to pd.read_excel() for multiple worksheets of the same workbook pd.read_exc ...
- matlab读写视频VideoReader/VideoWriter
前言 视频处理分析的过程中,需要用到将视频一帧帧地读取.写入,本文就涉及此问题. 系统环境 1.系统:win7_64 2.matlab版本:matlab2015a 测试代码 代码一(读视频): %To ...
- Vue拖拽组件
vue开发公众号项目,***产品需要添加一个新的功能.拖拽功能.一听简单.百度上轮子挺多,直接拉一个过来用着就行.然鹅...兴奋之余,却失望至极.东西很多,没有一个能使得.你让我失望,那我就让你绝望. ...
- 国内Ubuntu镜像源
国内有很多Ubuntu的镜像源,包括阿里的.网易的,还有很多教育网的源,比如:清华源.中科大源. 我们这里以中科大的源为例讲解如何修改Ubuntu 18.04里面默认的源. 编辑/etc/apt/so ...
- ES6 — 箭头函数
一 为什么要有箭头函数 我们在日常开发中,可能会需要写类似下面的代码 const Person = { 'name': 'little bear', 'age': 18, 'sayHello': fu ...
- MVC思想-程序的控制流程-Struts2和SpringMVC黑马流程图
1.初探 javaEE就是搞清前后台是怎么交互的,而控制那个交互的就被称为是:C:控制器 C负责协调调度程序如何执行的,M负责读数据的处理,比如说:验证输入的密码是否正确,是否 有这个权限.V就简单了 ...
- JS给HTML5页面<Select></Select>绑定选中项
获取选中值: function setApprovalPersonName() { var name = $("#approvalPersion").find("opti ...
- js的模块化规范
js的模块化规范常见的有:AMD,CMD,commonJS,UMD,es6 前期在没有模块化的时候,js文件十分庞大,于是就按功能抽离划分为多个js文件. 但是在html页面通过script的方式加载 ...
- 大快DKhadoop开发环境安装常见问题与解决方案
2018年度国内大数据公司排名50强本月初榜单发布,榜单上看到大快搜索跻身50强,再看看他们做的DKHadoop发行版,的确还是蛮厉害的吧!最起码这款DKHadoop用起来确实在易用性方面要更好!Dk ...
- 【python】实例-用户登录系统
有N,E,Q三个选择,若选择Q或者中断,则系统退出.若其他选项,则持续让用户选择. #!/usr/bin/env python db = {} def newuser(): prompt = 'log ...