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. django中的ajax组件

    目录 django中的ajax 向服务器发送请求的途径 Ajax的特点 基于jquery实现的ajax请求 利用ajax实现计算器 利用ajax实现登陆认证 利用form表单进行文件上传 利用ajax ...

  2. 使用自己的域名解析cnblogs博客(CSDN也可以)

    本文主要介绍怎样使用自己购买的域名指向cnblogs博客 通常来说技术人员都会创建个自己的技术博客,总结下工作中的问题,经验等等,不过某些博客的访问链接的确是不太容易记忆或者输入,对我们分享造成一定的 ...

  3. 【opencv基础】OpenCV从Mat中提取某些行或列

    这两个函数返回的是指向原矩阵内部位置的指针,类似于浅拷贝: code cv::Mat align_mean(cv::Mat mean, cv::Rect facebox, float scaling_ ...

  4. hiho1622 有趣的子区间(YY)

    题目链接:http://hihocoder.com/problemset/problem/1622?sid=1230113 #1622 : 有趣的子区间 时间限制:10000ms 单点时限:1000m ...

  5. Vue2.x directive自定义指令

    directive自定义指令 除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令. 注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的 ...

  6. Mac OSX 正确地同时安装Python 2.7 和Python3

    出处:http://www.jianshu.com/p/51811fa24752 python3 默认安装位置:/usr/local/Cellar/python3

  7. linux上通过lighttpd上跑一个C语言的CGI小页面以及所遇到的坑

    Common Gateway Interface如雷贯耳,遗憾的是一直以来都没玩过CGI,今天尝试一把.Tomcat可以是玩CGI的,但得改下配置.为了方便,直接使用一款更轻量级的web服务器ligh ...

  8. [C++ Primer] : 第16章: 模板与泛型编程

    面向对象编程(OOP)和泛型编程都能处理在编写程序时不知道类型的情况, 不同之处在于: OOP能处理类型在程序运行之前都未知的情况, 而在泛型编程中, 在编译时就能获知类型了. 函数模板 模板是C++ ...

  9. SpringCloud初体验:五、Sidecar 将 PHP 这类非 Java 生态语言的服务接入 Spring Cloud

    先起一个 Sidecar 服务,一个PHP服务一个应用,和PHP服务部署在同一台机子,通过 localhost 访问,这样就解决了网络开销,相当于本地进程间调用 Sidecar 服务比较简单, 1.这 ...

  10. keepalived配置主从备份

    keepalived配置主从备份   keepalived是一个用于做双机热备(HA)的软件,常和haproxy联合起来做热备+负载均衡,达到高可用. 运行原理 keepalived通过选举(看服务器 ...