博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jvm(27.14.2),理解升级---堆,栈,方法区
阅读量:6690 次
发布时间:2019-06-25

本文共 1185 字,大约阅读时间需要 3 分钟。

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击

看完GC的回收策略之后,我们再来看一下堆,栈,方法区的交互。

首先我们必须牢记一句话,栈是堆和方法区的引用,学的越多对这句话的理解要越深。

1,这里的堆主要是对局部变量表来说的。

2,栈的内存地址是远远小于堆得,因为在栈中只是对象的引用。

3,gc回收只是回收堆内存,不用考虑栈的内存,因为栈的数据结构就是一旦出栈就会释放的。

栈也是JAVA虚拟机自动管理的,(不是由gc)栈类似一个集合(不过是有固定的容量),是由很多元素(专业术语:栈帧)组合起来的,在我们码代码的时候,每调用一个方法,在运行的时候,JAVA虚拟机就会自动在内存中分配对应的一块空间,那么这块空间就是一个

栈帧,也就自然属于栈了,而当方法调用结束后,对应的栈帧就会被释放掉,那么因为

JAVA程序从main方法开始执行,那么JAVA虚拟机就会在内存中分配一块main方法的栈帧,如果main方法里没有调用其它方法,那么,main方法调用结束后,会把main方法栈帧释放掉,此时,栈里没有了栈帧,程序结束。

4,使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

5,堆因为是不连续的,所以分配的内存是在运行期确认的,因此大小不固定。

栈是连续的,所以分配的内存大小要在编译期就确认,大小是固定的

6,堆主要用来存放对象的,栈主要是用来执行程序的

7,(1)堆主要放new的对象,而栈放基本类型和句柄,句柄指向的是堆。

(2)垃圾回收的时候回收的是堆,栈比较难回收,一般不回收(这个才是问你的原因,呵

呵)。

8,栈内存:

 

程序在栈内存中运行

 

栈中存的是基本数据类型和堆中对象的引用

 

栈是运行时的单元

 

栈解决程序的运行问题,即程序如何执行,或者说如何处理数据

 

一个线程一个独立的线程栈

 

堆内存:

 

程序运行所需的大部分数据保存在堆内存中

 

堆中存的是对象

 

堆是存储的单元,堆只是一块共享的内存

 

堆解决的是数据存储的问题,即数据怎么放,放在哪儿

 

所有线程共享堆内存

9,局部变量表所需的内存空间在编译期确定,当进入一个方法时,方法在栈帧中所需要分配的局部变量控件是完全确定的,不可动态改变大小

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击

转载地址:http://rjkoo.baihongyu.com/

你可能感兴趣的文章
浅入分析和Linux内核相关的文件夹/proc和/sys .
查看>>
Java 二分查找
查看>>
刚刚,阿里开源了一项重磅炸弹,终结程序员“中年危机”!
查看>>
《Spring Boot开发:从0到1》图片
查看>>
教你十分钟构建好 SpringBoot + SSM 框架
查看>>
吸烟场景运营商“烟客”获2000万元Pre-A轮融资,用于线下吸烟空间建设
查看>>
未来 Docker 的安全
查看>>
基于Android ActionBar的SearchView实时搜索结果
查看>>
spring boot +RabbitMQ +InfluxDB+Grafara监控实践
查看>>
马斯克的另一番“威胁论”:人类将成为人工智能的“宠物”
查看>>
Python 正则表达式(字符)详解
查看>>
Kali Linux 网络扫描秘籍 第三章 端口扫描(一)
查看>>
共享单车步入物联网军备战
查看>>
PHP 魔术变量
查看>>
推荐的PHP编码规范
查看>>
Gartner报告:东方金信进入Hadoop世界厂商名录
查看>>
Python_(1)数据类型及其常见使用方法(图文)
查看>>
如何查看WWN号
查看>>
主页被劫持问题
查看>>
linux中awk学习小结
查看>>