十六、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. ...
随机推荐
- HDU 4403 A very hard Aoshu problem(dfs爆搜)
http://acm.hdu.edu.cn/showproblem.php?pid=4403 题意: 给出一串数字,在里面添加一个等号和多个+号,使得等式成立,问有多少种不同的式子. 思路: 数据量比 ...
- struct和typedef struct用法和区别
1 首先://注意在C和C++里不同 1.1 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu ...
- 1.spring基础知识讲解
引言:以下记录一些自己在使用时pringle框架时的一些自己心得合成体会时,如有侵权,请联系本博主. 1. spring基本都使用 spring是一个开源的轻量级框架,其目的是用于简化企业级应用程序开 ...
- Given d and e, factorize N to attack RSA
题目如下: RSA算法的使用一般要求每个不同的用户有一个独立的模数N.有天,Bob脑洞大开,认为似乎没有必要这样做.只需要一个模数N,然后给不同的用户分发不同的e和d就好了.可惜这种做法有严重的安全漏 ...
- 浅谈 Java JPDA
前言 程序员在坊间有非常多有趣的故事,其中就有这么一则:”这个在我的电脑上是好的,没问题的呀,诺,你看咯,一定是你打开姿势不正确,浏览器版本不正确,操作系统不统一等,总之不是我代码问题(傲娇)”.看到 ...
- tensorflow example1
用tensorflow实现J(w)=w**2-10*w+25的微分结果 import numpy as npimport tensorflow as tf w=tf.Variable(0,dtype= ...
- js 动画效果实现
1. 实现方式 - 应用场景 自己写 - 简单的.不用 jq 的项目 jq - 普通动画 成熟插件 - 复杂动画 2. 相关文章 JavaScript基于时间的动画算法 九种原生js动画效果 Twee ...
- 原生ajax的请求封装get和post
一个完整的AJAX请求包括五个步骤: 1.创建XMLHTTPRequest对象 2.使用open方法创建http请求,并设置请求地址 3.设置发送的数据,开始和服务器端交互 4.注册事件 5.获取响应 ...
- Lua报错:invalid key to 'next'
1.问题产生的原因是,在一个循环里对table中的元素先进行置空操作,再进行增加新元素的操作,就会报这个错误. 2.比如下面的例子:(当中间的函数足够复杂并进行封装了的情况下,不会留意到存在这个问题) ...
- 算法笔记--字典树(trie 树)&& ac自动机 && 可持久化trie
字典树 简介:字典树,又称单词查找树,Trie树,是一种树形结构,是哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较. 性质:根节点不包含字符,除根节点外每一个 ...