十六、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. ...
随机推荐
- 从命令行git转到Tortoise
阅读前请注意:本文先学命令行git的,但过不久遇到乱码问题久久不能解决,最后转向tgit. 2016-29 安装 next 下一步 设置目录 勾选需要的项: Additional icons是关于图标 ...
- HDU 3047 Zjnu Stadium(带权并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=3047 题意: 给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的. 思路: ...
- Jquery 点击事件重复获取叠加 (一)
用jquery添加绑定事件 添加多少次 点击的时候就触发多少次 如果想解决这个问题 就在点击函数里先用 $(对象).off("click") 取消上一次的点击事件 上码: $(&q ...
- SQLServer代理新建或者编辑作业报错
SQLServer代理新建或者编辑作业的时候报错如下 错误信息: 标题: Microsoft SQL Server Management Studio------------------------- ...
- lombok-@Accessors注解
@Accessors 有3个选项:如图默认是false 1.当fluent = true时 2.当fluent = true时
- win10 下载安装eclipse
官网:https://www.eclipse.org 选择下载包 选择下载win 64版本 解压后目录结构如下: 点击运行eclipse
- CentOS7 下更改源
在CentOS 7下更改yum源与更新系统. [1] 首先备份/etc/yum.repos.d/CentOS-Base.repo cp /etc/yum.repos.d/CentOS-Base.rep ...
- Qt5文件操作_保存成"UTF-8"格式
1. bool TdrawSvg::Save2File(char* _pcFullFileName) { // http://blog.csdn.net/u011314012/article/deta ...
- [转][cesium]1.添加本地服务器
转自:http://www.cnblogs.com/fuckgiser/p/5633748.html 此系列cesium总教程: https://www.cnblogs.com/fuckgiser/ ...
- d3选择全部子节点,不知道class和id
https://github.com/d3/d3-selection/issues/63 selection.selectAll("*")