Java内存分为两种:堆内存和栈内存。

  一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间。堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生一个数组或对象后,还可以在栈中定义一个特殊的变量。这个变量的取值等于数组活对象在堆内存中的首地址。在堆中,这个特殊的变量就变成了数组活对象的引用变量,以便在程序中可以使用栈内存中的引用变量来访问堆中的数组或对象。

  Java中的堆是一个运行时数据区,不需要程序代码来显式的释放。堆的优势是可以动态地分配内存大小。Java的垃圾回收机制回收不再使用的数却,缺点是由于在运行时动态分配内存,存取速度较慢。栈的优势是存取速度比堆快。仅次于寄存器。栈数据可以共享,缺点是栈中的数据大小与生存周期必须是确定的。缺点是缺乏是灵活性。栈中主要存放一些基本类型变量和对象句柄。存储在栈中的数据可以共享

  内存分配的原则:静态,栈式,堆式

  静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间。静态存储分配需求在编译时能知道所有变量的存储要求。

  栈式存储分配是由一个类似于堆栈的运行栈来实现的,也称动态存储分配。和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行时才知道。但规定在运行中进入一个程序模块时,必须知道该模块所需的数据区大小才能为其分配内存。栈式存储分配按照先进后出的原则进行分配。栈式存储分配要求在过程的入口处必须知道所有的存储要求。

  堆式存储分配负责在编译时或运行时模块入口处都无法确定存储要求的数据结构。

  JVM是基于堆和栈的虚拟机。JVM为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存线程的状态。JVM堆堆栈只进行了两种操作,以帧为单位压栈和出栈工作。

  某个线程正在执行的方法称为此线程的当前方法。当前方法使用的帧称为当前帧。当线程激活了一个方法,JVM会在线程的Java堆栈里新压入一个帧,这个帧成为了当前帧,在此方法的执行期间,这个帧将用来保存参数,局部变量中间计算过程和其他数据。

  每个Java应用都唯一对应一个JVM实例。每一个实例对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由所有的线程共享。Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但这个对象的引用确实在堆栈中分配的。

堆&栈的更多相关文章

  1. java数据结构之(堆)栈

    (堆)栈概述栈是一种特殊的线性表,是操作受限的线性表栈的定义和特点•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈•特点:先进后出(FILO)或后进先出(L ...

  2. 堆”,"栈","堆栈","队列"以及它们的区别

    如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到, ...

  3. 堆,栈,内存管理, 拓展补充-Geekband

    8, 堆,栈,内存管理 栈:  local objects 在离开作用域之后就会被消除.  堆: new MyClass 一直会存在 静态对象: static local object    作用域在 ...

  4. 转:C/C++内存管理详解 堆 栈

    http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了 ...

  5. 堆/栈的比较 以及 malloc/new动态内存的开辟

    堆与栈的比较:1.申请方式(1)栈(satck):由系统自动分配.(2)堆(heap):需程序员自己申请(c:调用malloc,realloc,calloc申请 free 来释放),并指明大小,并由程 ...

  6. java 堆 栈 常量池

    java 堆中保存new 出来的对象(每个对象都包含一个与之对应的class的信息,[class信息存放在方法区]),堆中分配的内存,有虚拟机的自动垃圾回收器管理,栈内存只对其所属线程可见. java ...

  7. java基础学习之"堆" "栈" "静态存储区" "方法区"

    引用部分 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来) Java堆.栈和常量池以及相关String的讲解 等我看完"深入理 ...

  8. 堆&栈的理解(转)

    (摘自:http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html) C++中堆和栈的理解 内存分配方面: 堆: 操作系统有一个记录空闲内 ...

  9. java 堆 栈 方法区的简单分析

    Java里的堆(heap)栈(stack)和方法区(method) 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创 ...

随机推荐

  1. Hadoop中 Unable to load native-hadoop library for your platform... using builtin-java classes where applicable问题解决

    环境 [root@vm8028 soft]# cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m [root@vm8028 sof ...

  2. ORACLE SQL 函数 INITCAP()

    INITCAP() 假设c1为一字符串.函数INITCAP()是将每个单词的第一个字母大写,其它字母变为小写返回. 单词由空格,控制字符,标点符号等非字母符号限制. select initcap('h ...

  3. oracle查询视图归属于哪个用户

    select OWNER from ALL_VIEWS where VIEW_NAME='视图名';

  4. SQL - 数据查询

    数据查询是数据库的核心操作.SQL 提供了 select 语句进行数据查询,该语句的一般格式为: select  [ ALL | distinct ] <目标列表达式>  [ ,<目 ...

  5. Consider defining a bean of type 'org.springframework.data.redis.connection.RedisConnectionFactory' in your configuration

    Description: Parameter 0 of method redisTemplate in com.liaojie.cloud.auth.server.config.redis.Redis ...

  6. java旅程(二) 基本语法

    java变量: 数值型        整数类型(byte,short,int,long)浮点类型(float,double) 字符型 char 基本数据类型                       ...

  7. 64位Ubuntu下配置CP-ABE环境

    CP-ABE环境配置 本文密码学专业,论文仿真需要CP-ABE,现将配置过程作个记录 cpabe依赖pbc,pbc依赖gmp,gmp依赖M4.bison.flex,所以.. sudo apt-get  ...

  8. suffix word al ain aire out ~A1

    1◆ al 2◆ ain ~的人   3◆ aire 表名词  

  9. Object转Integer,String

    object先转为字符串,然后通过int 的封装类(Integer)的pasreInt()方法转为int 例如: Object  ob = 123; Integer.parseInt(String.v ...

  10. tensorflow之word2vec_basic代码研究

    源代码网址: https://github.com/tensorflow/tensorflow/blob/r1.2/tensorflow/examples/tutorials/word2vec/wor ...