首页 > 编程知识 正文

java的堆,java的堆和栈

时间:2024-04-27 11:08:35 阅读:334606 作者:CPSY

本文目录一览:

java中堆和栈有什么区别?

堆:(对象)

引用类型的变量,其内存分配在堆上或者常量池(字符串常量、基本数据类型常量),需要通过new等方式来创建。

堆内存主要作用是存放运行时创建(new)的对象。

(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)

栈:(基本数据类型变量、对象的引用变量)

基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放。

栈内存的主要作用是存放基本数据类型和引用变量。栈的内存管理是通过栈的"后进先出"模式来实现的。

(主要用来执行程序,存取速度快,大小和生存期必须确定,缺乏灵活性)

北大青鸟java培训:堆和栈的区别?

栈:在编译过程中分配的内存空间是由操作系统(编译器)自动分配和释放的,而堆栈上的空间是有限的。

在编译过程中,程序在堆栈上同时为变量和函数分配内存,并且在堆栈上执行运行时函数调用的参数传递。

堆:在程序运行期间动态分配的内存空间,您可以根据程序运行的方式来确定要分配的堆内存的大小。

发行版通常由程序员分配。

内存函数的分配,如new和malloc,分配给堆。

栈是机器系统提供的数据结构,堆由C/c++函数库提供。

栈是系统提供的功能,其特点是快速高效,缺点是有限的,数据不灵活;该堆栈是函数库的函数,具有灵活性和方便性的特点,数据被广泛使用,但效率可以降低。

栈是系统数据结构,它是流程/线程的唯一。

堆是函数库的内部数据结构,不一定是唯一的。

不同堆分配的内存不能相互操作。

堆栈空间有两种静态分布和动态分配。

静态分配由编译器完成,例如自动变量(自动)分布。

动态分配由alloca函数完成。

栈的动态分配不需要释放(自动),也没有释放函数。

对于便携程序,不鼓励动态分配堆栈。

堆空间分配是动态的,虽然在程序的末尾,所有的数据空间都将被释放回系统中,但是精确的应用程序内存/空闲内存匹配是良好应用程序的基本要素。

堆内存用于保存由新分配的内存在堆中创建的对象和数组,并由虚拟机的自动垃圾收集器管理。

创建了一个数组或对象在堆中,堆栈可以也是一个特殊的变量,让栈中这个变量的值等于数组或对象在堆内存地址,栈中的变量是一个数组或对象的引用变量,它可用于程序后引用变量来访问堆中的堆栈数组或对象,引用变量是一个数组或对象名称。

引用变量是在定义时在堆栈中分配的普通变量,并且在程序超出其范围后会释放引用的变量。

江西电脑培训发现和数组在堆中分配和对象本身,即使您的应用程序是使用新的数组或对象声明的一个代码块,数组和对象本身占用内存不会被释放,数组和对象没有引用变量指向它,成为一种浪费,不在使用,但仍占据内存空间,其次是垃圾收集器在一个不确定的时间。

java堆栈是什么意思?

简单的说:Java把内存划分成两种:一种是栈内存,一种是堆内存。x0dx0a x0dx0a在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。x0dx0a x0dx0a堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象

请简单通俗易懂的解释一下在Java中什么叫堆 什么叫栈 谢谢

堆:也叫动态内存,相当于一个内存池子,在java中创建对象的时候,就从堆里面拿出一块来存放对象;当GC(垃圾回收)回收对象的时候,又把对象占用的内容还给堆。

举个例子:堆就好比一个面团,类就好比一个馒头印子,用印子从面团中取出一小块面团,印成馒头,这个馒头就是这个馒头印子类产生的对象了。当无限的创建馒头的时候,这个面团总会被用光的,这个时候就不能在创建新的馒头了。

所有GC就有存在的必要了,当对象不被持有的时候,GC就会把对象还给堆。也就是,当这个馒头没有被使用,这个馒头就变成小面团,还给面团。

栈:也是一段内存,但是这段内存比较有特点,遵循一个先进后出的规则。

举个例子:吃过罐装的薯片吧,薯片一片一片的放到罐里面去,想想,最先放进去的是不是放在罐的最底部。现在一片片把薯片取出来,是不是要从最顶部开始去,也就是最后放进去的,最先取出来。这个薯片放进去和取出来的这个过程,就是栈的工作原理啦(先进入的后出来,后进入的先出来)

在java中的栈:栈的原理明白了,其实只要是计算机只要是编程语言,什么堆什么栈都是一样的,基本作用也一样。java中可以认为,栈用来存放局部变量的。

public void fun(){

int i=0; //i 是一个局部变量,存放在栈里面的

Object obj = new Objec(); //obj 是一个对象应用,同样也是一个局部变量,存放在站里面的,但是obj指向的对象,在存在堆中

}

北大青鸟java培训:增加java堆空间方法?

在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32未Solaris操作系统(SPARC平台版本)上,默认的最大堆空间和起始堆空间大小为-Xms=3670K和-Xmx=64M。

对于64位操作系统,一般堆空间大小增加约30%。

但你使用Java1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分之一。

要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK1.5之后都支持)来查看,在VMSummary页面可以看到最大的堆大小。

用这种方法你可以根据你的程序的需要来改变堆内存大小,我强烈建议采用这种方法而不是默认值。

如果你的程序很大,有很多对象需要被创建的话,你可以用-Xmsand-Xmx这两个参数来改变堆内存的大小。

Xms表示起始的堆内存大小,Xmx表示最大的堆内存的大小。

另外有一个参数-Xmn,它表示newgeneration(后面会提到)的大小。

陕西电脑培训认为有一件事你需要注意,你不能任意改变堆内存的大小,你只能在启动JVM时设定它。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。