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. 元类应用ORM实现

    首先看下一个简单的例子 # 需求 import numbers class Field: pass class IntField(Field): # 数据描述符 def __init__(self, ...

  2. PostgreSQL常用查看命令

    1. 查看当前库sehcma大小,并按schema排序 SELECT schema_name, pg_size_pretty(sum(table_size)::bigint) as "dis ...

  3. Ajax请求中的async:false/true的作用【转载】

    [Ajax请求中的async:false/true的作用] 作者:https://www.cnblogs.com/mmzuo-798/p/7098979.html 前言: 昨天在做倒计时修改的时候,发 ...

  4. python格式化日期

    #!/usr/bin/python # -*- coding: UTF-8 -*- import time import calendar """ 时间元组(年.月.日. ...

  5. vp uml uninstall

    1◆ vp uml uninstall D:\devsoft\ultimate\idea\plugins\sdeIJ         D:\devsoft\ultimate\idea\bin\sde ...

  6. js如何简单实现汉字转成拼音的功能

    最近项目需要一个功能,实现汉字转拼音功能,具体比如说输入一个“你好”,同时带出对应拼音“NiHao”,在此做一下记录 1.首先引入两个文件 <script src="jquery.mi ...

  7. lubuntu16.04 安装过程以及ssd测试模型的环境配置

    1.系统启动盘(ultraISO)制作启动盘, 1/5 文件->打开,打开我们的iso镜像 2/5 选择我们的u盘, 3/5 点击启动->写入硬盘映像 4/5 写入方式选择raw,格式化然 ...

  8. Animation和Animator 的区别

    此文章转载于极视学堂!!!! ①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的. Animation 控制一个动画的播放,而Animator是多个 ...

  9. 如何写java求和源代码

    1.设计思想:利用eclipse编写. 2.程序流程图:先建立一个包->建立一个类->写代码->运行->修正错误,完善代码. 3.源程序代码: package dijia; p ...

  10. Spring Boot + Druid 监控数据库(三)

    Druid可以做什么?  1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助. 2) 替换DBC ...