JVM -- Java Virtual Machine(Java虚拟机)

  —— 因为要说堆和栈,所以我们必须要先简单的说一下JVM。(JVM详细请找度娘啦~)

  首先,我们都知道 java 一直宣传的口号是:一次编译,到处运行。其实它具体的实现是因为 java 程序经过一次编译之后,将 java 代码编译为字节码也就是 class 文件,然后只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。

  所以说它是 java 的核心和基础。

  个人觉得,它大概的执行过程就是:

    ① 加载 .class 文件(它也只能加载class文件)

    ② 管理并分配内存

    ③ 执行垃圾回收

  (emmm..就到这吧。下面才是重点)

  JVM 的内存分配 -- JVM 的内存划分为五片,分别是:PC寄存器、方法区、堆、Java栈、本地方法栈

    1. 方法区和堆由所有线程共享

    2. Java栈和PC寄存器由线程独享,在新线程的创建的时间里

    3. 本地方法栈:存储本地方法调用的状态

  下面重点说一下,堆和栈。

堆(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、堆和栈 -- 初步了解的更多相关文章

  1. Java基础-JVM堆与栈

    首先看一个解析列子 JVM的内存空间: (1). Heap 堆空间:分配对象 new Student() (2). Stack 栈空间:临时变量 Student stu (3).Code 代码区 :类 ...

  2. java 中 heap(堆)和stack(栈)的区别

    总结在Java里面Heap和Stack分别存储数据的不同. 区别项 Heap(堆) Stack(栈) JVM中的功能 内存数据区 内存指令区 存储数据 对象实例(注1) 基本数据类型, 指令代码,常量 ...

  3. java内存管理(堆、栈、方法区)

    java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉 ...

  4. Java内存分配之堆、栈和常量池

    Java内存分配主要包括以下几个区域: 1. 寄存器:我们在程序中无法控制 2. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 3. 堆:存放用new产生的数据 4. 静 ...

  5. Java内存分配之堆、栈和常量池(转)

    摘录自http://www.cnblogs.com/SaraMoring/p/5687466.html Java内存分配主要包括以下几个区域: 1. 寄存器:我们在程序中无法控制 2. 栈:存放基本类 ...

  6. JVM堆和栈的区别

    物理地址 堆的物理地址分配对对象是不连续的.因此性能慢些.在GC的时候也要考虑到不连续的分配,所以有各种算法.比如,标记-消除,复制,标记-压缩,分代(即新生代使用复制算法,老年代使用标记--压缩) ...

  7. JVM 堆和栈的区别

      栈内存:   程序在栈内存中运行   栈中存的是基本数据类型和堆中对象的引用   栈是运行时的单元   栈解决程序的运行问题,即程序如何执行,或者说如何处理数据   一个线程一个独立的线程栈   ...

  8. java中对JVM的深度解析、调优工具、垃圾回收

    jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工 ...

  9. 【转】jvm 堆内存 栈内存 大小设置

    原文地址:http://blog.csdn.net/qh_java/article/details/46608395 4种方式配置不同作用域的jvm的堆栈内存! 1.Eclise 中设置jvm内存: ...

随机推荐

  1. for-auto使用

    前言 c++11新增了一个工具,让编译器能够根据初始值的类型推断变量的类型: c++11还新增了一种循环,基于范围的for循环,可以对数组或者容器类的每一个元素执行相同的操作:同时,可以使用& ...

  2. 前端jquery---表单验证

    重点: 1.表单的提交 2.触发blur事件 3.判断是否正确,提交与否 return False <!DOCTYPE html> <html lang="en" ...

  3. CTF-练习平台-Misc之 再来一道隐写

    十二.再来一道隐写 下载文件后打开,用常用的几个方法都没有找到有用的信息,然后观察图片发现搞度有点低,所以用WinHex打开把图片高度改大,保存.再次打开图片发现flag

  4. Java 发展历史

    Java自1995诞生,至今已经20多年的历史. Java的名字的来源:Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语言中的许多库类名称,多与咖啡有关,如JavaBeans(咖啡豆 ...

  5. java中字符与字节的编码关系

    在 GB 2312 编码或 GBK 编码中,一个英文字母字符存储需要1个字节,一个汉字字符存储需要2个字节. 在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节. ...

  6. virtualbox centos安装增强工具和问题详解

    virtualbox centos安装增强工具和问题详解 VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox 在虚拟机中安装 ...

  7. 未能正确加载“VSTS for Database Professionals Sql Server Data-tier Application”包。(转)

    今天费了九牛二虎之力,重转好了vs2010之后,打开解决方案,报出下面的错误: ---------------------------Microsoft Visual Studio---------- ...

  8. IE 10 如何设置支持CRM4 正常浏览

    通过工具—> 选择兼容性视图 就可以了.具体如下图:

  9. kvm 基本运维命令

    Kvm基本命令 一.查询命令 1.列出所有的虚拟机 virsh list –all 2.显示虚拟机信息 virsh dominfo kvm-1 3.显示虚拟机内存和cpu的使用情况 yum insta ...

  10. javascript 全选 反选 js代码

    <script type="text/javascript"> //全选function checkAll() { var objs = window.document ...