十六、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. ...
随机推荐
- Echarts 设置地图大小
项目中要添加地图,默认地图太小,折腾半天终于找到解决方案. series: [ { //name: '香港18区人口密度', type: 'map', mapType: 'jiangsu', // 自 ...
- oracle 新建用户
create user username identified by password; grant dba to username; 授权 或 grant connect, resource to ...
- 封装fetch的使用(包含超时处理)
// 1: 传统fetch操作 fetch('http://facebook.github.io/react-native/movies.json') .then((response) => r ...
- win10 安装keras
1.安装Python环境 建议安装Anconda3 ,4.2.0版本 下载地址: https://repo.continuum.io/archive/index.html 或 https://mirr ...
- 借助JCharDet获取文件字符集
前段时间,在学习lucene的时候,遇到了读取txt文档遇到编码错误的问题.学了几个解决方案,大部分是将文件转十六进制(可以使用UE的Ctrl+H来查看),读取开头的四个标志位来判断.可是总有些文本文 ...
- Ubuntu下postgresql安装及常见错误处理
依赖工具库 注意: 默认用户名是postgres 以下命令是Ubuntu操作系统中的命令 make GCC Zlib 安装命令:sudo apt-get install zlib1g-dev 注意有些 ...
- 《剑指offer》第六十五题(不用加减乘除做加法)
// 面试题65:不用加减乘除做加法 // 题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷ // 四则运算符号. #include <iostream> int A ...
- python3+虹软2.0 离线人脸识别 demo
python3+虹软2.0的所有功能整合测试完成,并对虹软所有功能进行了封装,现提供demo主要功能,1.人脸识别2.人脸特征提取3.特征比对4.特征数据存储与比对其他特征没有添加 虹软SDK下载戳这 ...
- Word Ladder(双向BFS)
2018-10-02 23:46:38 问题描述: 问题求解: 显然是个解空间遍历问题,每次修改其中一位,由于步长是1,所以可以使用BFS进行解空间的遍历.
- 雷林鹏分享:jQuery EasyUI 窗口 - 自定义带有工具条和按钮的对话框
jQuery EasyUI 窗口 - 自定义带有工具条和按钮的对话框 您可以创建一个带有工具栏(toolbar)和按钮(button)的对话框(dialog),可以从 HTML 标记创建.这个教程描述 ...