十六、JAVA基础(堆和栈)
一、堆和栈
堆和栈都是JAVA中的存储结构,也就是说,都是内存中存放数据的地方。
1、堆:(存放由new创建的对象和数组)
引用类型的变量,内存分配一般在堆上或者常量池(字符串常量,基本数据类型常量),需要通过new等方式来创建。
首先堆内存主要作用是存放运行时new的对象和数组,存取速度慢,可以运行时动态分配内存。
2、栈:(基本数据类型变量,对象的引用变量)
基本数据类型变量(int,short,long,byte,float,double,boolean,char)以及对象的引用变量,内存分配在栈上。变量出了作用域就会自动释放。
由于栈是后进先出模式的。主要用于执行程序,存取速度快,大小生存期必须确定,也就是有作用域,缺乏灵活性。
public class Apple{
private int id;
private float price;
private String name;
public Apple(int id,float price,String name){
this.id=id;
this.price=price;
this.name=name;
} public static void main(String[] args){
int a=0;//i基本数据类型变量,在栈里面存放
Apple app=new Apple(1,10,"红富士")//app是对象的引用变量,存放在栈里面,
//Apple(1,10,"红富士")是实际的对象,存放在堆里面
}
}
3、JVM
JVM是基于堆栈的虚拟机,每个JAVA程序在一个独立的JVM实例上运行,每个JVM实例对应一个堆,同一个JAVA程序内的多线程运行在同个JVM实例上,多个线程之间通过共享堆内存来实现同步。
4、堆内存和栈内存的区别
当一个方法执行的时候,每个方法都会建立自己的栈内存,在这个方法中定义的变量将会放到这个栈内存中,随着方法的结束,这个方法的栈内存也会被自动销毁,不需要进行GC(垃圾)回收。总而言之就是,所有在方法中定义的局部变量存放在栈内存中。
当为程序创建一个对象的时候,这个对象会被保存到运行时候的数据区中,方便反复利用(因为创建对象的成本比较大),这个运行时候的数据区就是堆内存中。堆内存中的对象不会随着方法的结束而自动销毁,有可能方法结束后,这个对象还可能被另外一个引用变量所引用。只有当一个对象没有任何引用变量去引用它的时候,系统的垃圾回收GC才会启动进行销毁。
5、创建对象的开销成本比较大
因为创建对象的根本路径就是构造方法,通过new关键字来调用一个类中的构造方法才能创建这个类的实例。但是对象并不是完全由构造方法来创建的,当程序调用构造方法的时候,系统会给这个对象分配内存空间,然后进行对象初始化。也就是说,系统创建对象是在构造方法执行之前就完成的,只是此时这个对象还不能被外部程序访问,只能在构造方法中通过this来引用。当构造方法执行结束后,这个对象作为构造方法的返回值被返回,然后把它赋给一个引用类型的变量,让外部程序可以访问。
6、JAVA比较占内存的原因
数组和对象在没有引用变量指向的时候,才变成垃圾,不能被使用,但是它依然占着内存,随后在一个不确定的时候才会被垃圾回收GC器给释放掉。
也可以这么理解,实际上存放在栈内存里面的引用变量,指向堆内存中的对象,这就是JAVA的指针。
十六、JAVA基础(堆和栈)的更多相关文章
- Java实习生常规技术面试题每日十题Java基础(六)
目录 1.在Java语言,怎么理解goto. 2.请描述一下Java 5有哪些新特性? 3.Java 6新特性有哪些. 4.Java 7 新特性有哪些. 5.Java 8 新特性有哪些. 6.描述Ja ...
- Java实习生常规技术面试题每日十题Java基础(八)
目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...
- java之堆和栈的比较
当我们第一次接触堆和栈时很多人都不不明白java中为什么要设置这两个概念,他们都有什么作用?堆和栈有什么区别,各自都有什么特点?还有Java中存在栈这样一个后进先出(Last In First Out ...
- Java实习生常规技术面试题每日十题Java基础(七)
目录 1. Java设计模式有哪些? 2.GC是什么?为什么要有GC? 3. Java中是如何支持正则表达式. 4.比较一下Java和JavaSciprt. 5.Math.round(11.5) 等于 ...
- Java实习生常规技术面试题每日十题Java基础(五)
目录 1.启动一个线程是用run()还是start()? . 2.线程的基本状态以及状态之间的关系. 3.Set和List的区别,List和Map的区别? 4.同步方法.同步代码块区别? 5.描述Ja ...
- Java实习生常规技术面试题每日十题Java基础(四)
目录 1.String 和StringBuffer的区别. 2.数组有没有length()这个方法? String有没有length()这个方法? 3.final, finally, finalize ...
- Java实习生常规技术面试题每日十题Java基础(三)
目录 1.是否可以从一个static方法内部发出对非static方法的调用? 2.Integer与int的区别? 3.Overload和Override的区别.参数列表相同,返回值不同的方法,是否是重 ...
- Java实习生常规技术面试题每日十题Java基础(二)
目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...
- Java实习生常规技术面试题每日十题Java基础(一)
目录 1.Java 的 "一次编写,处处运行"如何实现? 2.描述JVM运行原理. 3.为什么Java没有全局变量? 4.说明一下public static void main(S ...
- Java中堆和栈的区别(转)
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...
随机推荐
- 【译】第5节---Code First约定
原文:http://www.entityframeworktutorial.net/code-first/code-first-conventions.aspx 我们在上一节中已经看到了EF Code ...
- _itemmod_enchant_groups
随机附魔组 附魔组 `groupId` 分组编号,同一groupId的附魔效果被随机抽取 `enchantId` 附魔Id 对应SpellItemEnchantment.dbc `chance` 被抽 ...
- Tomcat日志系统详解
综合:Tomcat下相关的日志文件 Cataline引擎的日志文件,文件名catalina.日期.log Tomcat下内部代码丢出的日志,文件名localhost.日期.log(jsp页面内部错误的 ...
- Ubuntu ls: cannot open directory .: Permission denied
把该目录赋予权限: sudo chmod xxx
- fit_transform和transform的区别
来自:泡泡糖nana 来自:俞驰 1. fit_transform是fit和transform的组合. 2. fit(x,y)传两个参数的是有监督学习的算法,fit(x)传一个参数的是无监督学习的算法 ...
- 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句
在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句 突然看到这个问题,脑袋一蒙,不知道啥意思,后来想想,试图把select里的选项放到后面,问题自然解决! 下面这 ...
- 第 6 章 存储 - 040 - docker managed volume
docker managed volume 与 bind mount 在最大区别是不需要指定 mount 源,指明 mount point 就行了 通过 -v 告诉 docker 需要一个 data ...
- idea ----> 使用idea工具整合mybaiti时出现的问题总结
使用idea测试mabtis实例时出现 java.lang.IllegalArgumentException: Mapped Statements collection does not conta ...
- windows/browser ----> cmd命令/powershell命令/chrome插件vimuim命令
windows 7 cmd常用命令: 1.进入某盘,比如d盘:d:(有一个冒号) 2.显示d盘的文件夹和文件:dir 3.进入d盘某个文件夹:cd filename 4.清除屏幕:cls 5.查看ip ...
- gradle ----> 安装和使用
1.安装gradle 参考官网教程:https://gradle.org/install/ 安装的前提:要求安装jdk1.7或者以上 比较重要的一步:配置环境变量,把gradle的bin目录的全路径配 ...