- 浏览: 225449 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
synack:
写的很好,图文并茂,语言简单清晰,赞!
SkipList 跳表 -
king_c:
jiandandecaicai 写道你好,请教一下是如何通过E ...
从Hadoop URL 中读取数据 -
jiandandecaicai:
你好,请教一下是如何通过Eclipse来连接Hadop机群的, ...
从Hadoop URL 中读取数据
在JAVA中,有六个不同的地方可以存储数据:
1.
寄存器(register)。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。
2.
堆栈(stack)。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其中。
3.
堆(heap)。一种通用性的内存池(也存在于RAM中),用于存放所以的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。
4. 静态存储(static
storage)。这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的,但JAVA对象本身从来不会存放在静态存储空间里。
5. 常量存储(constant
storage)。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中
6. 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。
就速度来说,有如下关系:
寄存器 < 堆栈 < 堆 < 其他
『上面这段话摘取之《Thinking in Java》』
在这里,主要要说下堆与堆栈的关系:
堆:堆是heap,是所谓的动态内存,其中的内存在不需要时可以回收,以分配给新的内存请求,其内存中的数据是无序的,即先分配的和随后分配的内存并没有什么必然的位置关系,释放时也可以没有先后顺序。一般由使用者自由分配,malloc分配的就是堆,需要手动释放。
堆栈:就是STACK。实际上是只有一个出入口的队列,即后进先出(First In Last
Out),先分配的内存必定后释放。一般由,由系统自动分配,存放存放函数的参数值,局部变量等,自动清除。
还有,堆是全局的,堆栈是每个函数进入的时候分一小块,函数返回的时候就释放了,静态和全局变量,new
得到的变量,都放在堆中,局部变量放在堆栈中,所以函数返回,局部变量就全没了。
其实在实际应用中,堆栈多用来存储方法的调用。而对则用于对象的存储。
JAVA中的基本类型,其实需要特殊对待。因为,在JAVA中,通过new创建的对象存储在“堆”中,所以用new
创建一个小的、简单的变量,如基本类型等,往往不是很有效。因此,在JAVA中,对于这些类型,采用了与C、C++相同的方法。也就是说,不用new
来创建,而是创建一个并非是“引用”的“自动”变量。这个变量拥有它的“值”,并置于堆栈中,因此更高效。
发表评论
-
c++引用计数的本质
2015-03-24 14:26 1389为什么要用引用计数? 场景:代码里X是一个 ... -
Java Decompiler project,java反编译器
2015-03-09 10:39 946The “Java Decompiler project” ... -
COM 数组传输-使用VARIANT传递数组的方法及步骤 .
2015-02-16 17:22 21在使用COM/DCOM写组件时经常要传递数组,一般比如SHO ... -
MFC程序中打印调试信息
2015-01-20 22:11 11511、在要打印调试的类中加上头文件 #include ... -
opencv轮廓提取与轮廓拟合
2015-01-05 09:55 2116#include <iostream> #i ... -
c语言操作二进制文件fopen中fseek的注意事项
2014-11-22 01:04 1270今天在使用fopen的时候,遇到了fseek(fp,0 ... -
C++中delete和delete[]的区别
2014-11-21 23:41 731一直对C++中的delete和delete[]的区别不甚 ... -
缺少streams.h的解决方法
2014-10-09 17:19 1117这几天在学DirectShow的开发,一个streams. ... -
使用ATL创建进程外组件
2014-03-24 22:39 1242一、建立一个进程外组件1)打开菜单File|New,选择Pr ... -
vector 转换成 数组 - [C++]
2013-12-13 18:06 4737参考: http://topic.csdn.n ... -
ref:Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器
2013-09-09 00:21 852原文地址:http://www.s135.com ... -
openMP
2013-06-08 23:32 1001最近在看多核编程。简单来说,由于现在电脑CPU一般都有两 ... -
nafxcw.lib与LIBCMT.lib在vs2008中链接冲突解决方案
2013-05-09 09:51 10701>正在链接...1>nafxcw.lib(af ... -
Errore HTTP 404.2 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
2012-11-20 17:46 991如题,这个错误google时一大堆各种各样的解决办法,但 ... -
error : Please use the /MD switch for _AFXDLL builds 的解决方法
2012-09-20 21:14 2773在用vs打开项目后,编译的时候出现“Please use ... -
JAVA23种设计模式
2012-07-04 21:28 737设计模式主要分三个类型:创建型、结构型和行为型。 ... -
启动框架 org.apache.catalina.startup(转)
2012-06-11 22:16 1107org.apache.catalina.startup ... -
共享内存的例子(转msdn)
2012-06-02 19:18 1501Creating Named Shared Memo ... -
使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
2012-03-17 22:47 1290在网上看到很多网友在.NET程序中调用Win32 API, ... -
Java主线程等待子线程执行完毕-CountDownLatch
2012-02-21 20:15 1175主线程: [java] view p ...
相关推荐
Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的引用变量。堆(heap)是 Java 中的一种动态...
在这个主题中,我们将深入探讨Java实现的三种基本数据结构:堆栈(Stack)、队列(Queue)和列表(List)。这些概念是计算机科学的核心部分,对理解和解决复杂问题至关重要。 1. **堆栈(Stack)**: - 堆栈是一种...
在ArrayStack类中,使用了一个Object类型的数组来存储堆栈中的元素。由于Java不支持直接创建泛型数组,所以声明数组为Object类型的,然后转型即可。 构造方法 ArrayStack类提供了一个无参构造方法,该方法创建一个...
首先,我们要明白堆栈是Java中用于存储局部变量、方法调用信息和运算过程的地方。每当一个方法被调用,JVM就会在堆栈上为该方法创建一个新的栈帧,其中包含方法的局部变量表、操作数栈、动态链接和方法返回地址。当...
- 堆是Java内存模型中的主要部分,主要用于存储对象实例。所有的类实例和数组都在堆中分配内存。 - 堆内存是动态分配的,大小可变,由Java虚拟机(JVM)管理。 - 垃圾回收机制(Garbage Collection, GC)负责自动...
本项目“堆栈实现的Java计算器”是数据结构课程设计的一个实例,旨在利用堆栈来实现一个能够处理基本算术运算的计算器。通过这个项目,我们可以学习到如何将理论知识应用到实际编程中,特别是如何使用堆栈解决计算...
### Java堆栈的区别详解 #### 一、预备知识—程序的内存分配 程序在运行时,根据不同的数据类型和用途,会被分配到不同的内存区域。这些区域包括: 1. **栈区(Stack)**:这部分内存由编译器自动管理,主要用于...
在示例代码中,`int i`转换为`object obj`,原本在堆栈中的int值被复制到堆中,创建了一个对象,而`obj`则在堆栈中存储对这个新对象的引用。解箱(Unboxing)是相反的过程,将引用类型转换回值类型。 程序的内存...
在Java中,对象的实例化和局部变量的存储分别使用堆和栈。 - **栈:**用于存储基本类型变量(如 int、char 等)和对象引用。当一个方法被调用时,一个新的栈帧会被创建;当方法返回时,栈帧被销毁。这种方式使得...
堆解决的是数据存储的问题,即数据怎么放、放在哪儿。在Java中,一个线程就会相应有一个线程栈与之对应,这点很简单理解,由于不同的线程执行规律有所不同,因此需要一个独立的线程栈。而堆则是全部线程共享的。 为...
Java 堆栈中的数据都是私有的,每个线程都不能访问其他线程的堆栈数据。在多线程情况下,也不需要对堆栈数据的访问进行同步。堆栈帧在内存中也不必是连续的,帧可以分布在连续的内存区,也可以不是。帧的数据结构由 ...
在这个“java泛型容器堆栈代码”中,我们将会探讨Java如何利用泛型来创建高效且类型安全的容器,特别是堆栈数据结构。 堆栈是一种基于“后进先出”(LIFO)原则的数据结构,常用于实现函数调用栈、内存管理等场景。...
### Java中堆内存和栈内存详解 #### 一、引言 Java作为一种广泛使用的编程语言,其内存管理机制是理解程序行为的关键。本文将深入探讨Java中的两种主要内存区域:堆内存(Heap Memory)和栈内存(Stack Memory)。...
Java编程语言中,内存管理是至关重要的概念,...总的来说,Java中的堆和栈内存是程序运行的基础,它们共同协作以提供高效、可靠的数据存储和管理。了解这两个内存区域的工作原理,有助于写出更高效、更稳定的Java代码。
在这个“堆栈算法的JAVA迷宫”项目中,我们将深入探讨如何利用Java编程语言和堆栈数据结构来解决迷宫问题,并创建一个具有交互界面的程序。 首先,堆栈是一种后进先出(LIFO)的数据结构,适用于处理需要回溯的问题...
1. **对象分配**:当创建一个对象时,它的实例数据会存储在堆中。如果对象的大小超过当前线程栈的剩余空间,就会发生栈溢出(StackOverflowError),反之则可能发生OutOfMemoryError。 2. **垃圾回收**:Java通过...
在Java内存管理中,堆(Heap)、栈(Stack)、常量池(Constant Pool)和方法区(Method Area)是四个核心概念,它们在Java程序运行时扮演着不同的角色。 首先,方法区是用来存放类的信息、常量、静态变量等数据的...
- **定义**:堆栈是一种后进先出(LIFO,Last In First Out)的数据结构,类似于现实生活中堆叠物品。最新加入的元素(顶部元素)最先被移除。 - **基本操作**:Java中,`java.util.Stack`类实现了堆栈功能,提供...
《清华邓俊辉Java数据结构》是一门深入探讨数据结构及其在Java编程语言中实现的课程。这门课程由清华大学的邓俊辉教授主讲,旨在帮助学生掌握数据结构的基本概念,理解它们的工作原理,并能用Java语言进行实际操作。...
数据结构中的堆栈是一种非常基础且重要的抽象数据类型,它遵循“后进先出”(LIFO, Last In First Out)的原则。堆栈在计算机科学和编程中有着广泛的应用,尤其是在算法和数据处理中。标题提到的“数据结构堆栈”...