博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM中的堆与栈的异同点.
阅读量:7246 次
发布时间:2019-06-29

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

JVM中的堆与栈的异同点.

一 .

  首先,个人认为,JVM中的堆和栈就像存放物品的两个"篮子",他们都有存储功能

  .但是这两个"篮子"组成结构不同,所拥有的存储量不同,能存放的物品也不相同.

二.

 JVM的栈是一种 

  (1)先进先出(FIFO) 的数据结构. 它存储局部变量和方法的调用.

  (2)在栈中创建或释放存储空间所需的时间远远小于堆,因为只需要移动栈顶的指针就可以完成这种操作.

  (3)但是栈的存储空间远远小于堆的存储空间

  (因为栈负责存储方法调用,可以得出,在C语言中用递归写Fib函数,如果递归次数过多,就可能出现爆栈的情况,也会在JAVA中出现.)

  (4)使用栈存储会牺牲灵活性,因为他不是动态的分配存储空间,用栈存储的时候需要确切的知道存储对象的各种属性.(所以JAVA中 一般用 堆来存储对象)

  (5)栈满抛出的异常是java.lang.Stack.OverFlowError.

  (6)栈内存属于单个线程,(一个进程可以有多个线程) 每个线程都有一个独立 栈内存. 因为线程之间不能相互干扰 (JAVA并发编程)

  PS:本人才学到并发的基础,最后一句的解释不懂会不会太绝对.

 

JVM中的堆

  (1)堆不是数据结构中所说的堆(完全二叉树) 堆负责存储实例化的对象 和数组的.

  (2)因为JAVA采用了 动态内存分配的方式, 所以new 生成的对象就是存放于堆中,但是由于堆中创建的对象,编译器对其的生命周期一无所知,会导致内存泄漏(C++的弊端) 但是由于JAVA的垃圾回收器GC,很好的避免了这个问题.

  (3)堆分配的内存的花费时间远远大于栈.

  (4)堆满抛出的异常是 java.lang.OutOfMemoryError

  (5)堆的动态创建方式带来了很大的灵活性,解决了很多问题.

  (6)堆内存中的所有对象对所有线程可见.

 

参考资料:

<<JAVA编程思想>>中的 1.10-对象创建与生命期, P13

JAVA 官方文档说明

GO语言JHP[趣味教程 <<并发不是并行>>

转载于:https://www.cnblogs.com/--zz/p/9646176.html

你可能感兴趣的文章
spring数据绑定默认的日期解析格式解析不了yyyy格式
查看>>
poi 下拉框实现
查看>>
百度地图通过地址得到经纬度
查看>>
ubuntu环境部署项目
查看>>
BZOJ 1017 魔兽地图DotR(树形DP)
查看>>
ecshop价格区间导航
查看>>
有时间可研究的题目
查看>>
3Sum
查看>>
vue -- 项目打包优化
查看>>
React实践debug:JSX输出的限制(存疑)
查看>>
Dapper.Rainbow 简单使用
查看>>
web基础
查看>>
Spring 5 新特性:函数式Web框架
查看>>
IoC
查看>>
微软视频学习
查看>>
第三章:垃圾回收器-G1收集器
查看>>
XML 和 List 互转类
查看>>
Grunt 快速入门
查看>>
《几何与代数导引》例2.9
查看>>
vc 获取窗口标题GetWindowText
查看>>