小伙伴们知道如何在java栈中内存动态扩展吗?这是虚拟机中的一个概念,下面让我们一起来看看该如何实现吧。

一、内存概念

在java中,我们一般会简单把java内存区域划为两种:堆内存与栈内存。其实这种划分是比较粗粒度的。其中栈内存就是指的是虚拟机栈,堆内存指java堆。

栈内存

实际为虚拟机栈。Java中每个方法被执行时都会同时创建一个栈帧,它会被用来存储局部变量、操作栈,动态链接,方法出口等信息。它的局部变量会包括各种基本类型的变量及对象的引用变量,且它们都是在方法的栈内存中分配。java局部变量所需内存空间一定是在编译期间完成的,当它进入一个方法时,这个方法所需的局部变量空间就已经确定,在方法运行期间一定不会改变。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间就能够立刻被另作他用。当线程请求的栈深度大于虚拟机所允许的深度,则抛出StackOverflowError异常。当虚拟机栈无法扩展时候则抛出OutOfMemoryError异常。

堆内存

堆内存唯一目的就是new出对象实例,它会在虚拟机启动时创建。它全部的对象实例与数组都需在堆上分配。堆是由垃圾回收负责的,所以也称为“GC堆”,垃圾回收采用的分代算法,堆因此分为新生代与老年代。堆的优势是可以动态地分配内存大小,生存期也不用事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但它有缺点,由于要在运行时动态分配内存,存取速度会较慢。

二、内存实现

动态扩展就是在栈空间不够的时候,自动加大栈的空间,避免StackOverflow异常,JVM是没有实现这个功能的。

动态栈一般有两种方法:Segmented stack和Stack copying:

Segmented stack

它可以这么理解,当一个双向链表把多个栈连接起来,它一开始只分配一个栈,当这个栈的空间不够时,就再分配一个,用链表一个一个连起来。

Stack copying

作用为在栈不够时,分配一个更大的栈,再把原来的栈复制过去。

使用函数alloca可以实现在栈上动态分配内存:The

function alloca has the same calling sequence as malloc;

however, instead

of allocating memory from the heap, the memory is allocated from the stack frame of the current

function.The advantage is that we don 't have to free the space;

it goes away automatically when the

function returns.The alloca

function

increases the size of the stack frame.The disadvantage is that some systems

can 't support alloca, if it'

s impossible to increase the size of the stack frame

after the

function has been called.Nevertheless, many software packages use it

, and implementations exist

for a wide variety of systems.

一般只支持Linux类型系统。#include

void *alloca(size_t size);

以上就是关于java栈内存动态扩展的所以内容了,更多相关java入门知识,可以来我们的网站来了解详情噢。

推荐阅读:

java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?相关推荐

  1. 【Java 虚拟机原理】栈帧 | 动态链接 | 方法区 | 字节码文件二进制分析

    文章目录 前言 一.方法区 二.字节码二进制文件分析 三.动态链接 1.动态链接简介 2.静态链接与动态链接 3.早期绑定 和 晚期绑定 4.动态链接示例 前言 " 栈帧 " 中存 ...

  2. java 动态库_java调用dll动态库文件的一般总结

    前一段时间,在项目需求中,需要调用一下第三方的动态库文件,下面是本人一些尝试的经历. 首先需要明白的是,在java中是不能直接调用动态库文件的,因为动态库文件是使用c或是c++编写的,作为一种跨   ...

  3. java动态代理_Java中的动态代理一

    方法newProxyInstance介绍 这篇开始学Java中的动态代理部分,刚开始,我们不去了解什么是动态代理相关的概念,除了动态代理,还有静态代理.我们学习动态代理直接从学习一个方法开始,这个方法 ...

  4. java多线程世界时钟_Java实现的动态数字时钟功能示例【显示世界时间】

    本文实例讲述了Java实现的动态数字时钟功能.分享给大家供大家参考,具体如下: 构建: 1. Clock继承 JFrame 为运行页面 2. ClockText 测试类 创建 Clock 对象 运行效 ...

  5. java gif图片_java 如何生成动态的gif图片

    网上找了很多资料都没有生成gif图片的例子.但是生成水印的文件到不少,如果我们把gif图片合成水印后,图片就不动了,所以我写了个小例子供大家参考.(如果你想在某个图片上打印个动感图标,这个类就能很好地 ...

  6. java动态时钟_Java实现的动态数字时钟功能示例【显示世界时间】|chu

    本文实例讲述了Java实现的动态数字时钟功能.分享给大家供大家参考,具体如下: 构建: 1. Clock继承 JFrame 为运行页面 2. ClockText 测试类 创建 Clock 对象 运行效 ...

  7. java byte 拓展_Java项目中如何扩展第三方jar包中的类?

    有些时候你对第三方得到jar包中的类并不是很满意,想根据实际情况做一些扩展.如果说第三方的jar包已经提供了一些可扩展的类,比如提供了Interceptor,Filter或者其他的类,那么使用原生的比 ...

  8. java如何实现动态时钟_java中的动态时钟

    你需要做的是使用Swing的 Timer课程. 让它每秒运行一次,并用当前时间更新时钟. Timer t = new Timer(1000, updateClockAction); t.start() ...

  9. 文件上传 java 进度条_Java如何实现动态显示文件上传进度条

    本文实例实现文件上传的进度显示,我们先看看都有哪些问题我们要解决. 1 上传数据的处理进度跟踪 2 进度数据在用户页面的显示 就这么2个问题, 第一个问题,主要是组件的选择 必须支持数据处理侦听或通知 ...

最新文章

  1. 链表问题7——判断一个链表是否为回文结构
  2. 机器学习数据清洗之异常数据处理、标准差法、MAD法、箱图法、图像对比法、异常值处理准则
  3. 用html5的canvas画布绘制贝塞尔曲线
  4. c efcore.mysql_EF Core在mysql中调用存储过程
  5. 理解JavaScript面向对象的思路
  6. NSDateFormatter and NSDateComponents
  7. FastDFS 安装
  8. linux---谈谈vfork和fork的区别及exit与return
  9. Java8 stream().map()将对象转换为其他对象
  10. C# 中构造函数与析构函数(二)
  11. SpaceX第二次商业载人任务发射日期不早于4月22日
  12. 集群类型以及提高服务器性能的技术概述
  13. 2021-05-22 Android 网络性能测试工具iperf详细使用方法
  14. 一套适合入门的Oracle学习视频
  15. python破解excel进入密码(密码字典)
  16. JAVA使用JEP进行动态公式计算
  17. chorme 下载文件 保留 放弃_怎样避免Chrome扫描下载文件
  18. QT实例-数据库分页查询
  19. alexa世界排名的登录及使用教材(转)
  20. layui upload 提示语

热门文章

  1. JSP动作元素/活动元素
  2. java jni开发_Java JNI开发实践记录
  3. 【技术解决方案】Windows平台下摄像头采集方案
  4. 【音视频安卓开发 (零)】用 Android NDK 编译 FFmpeg 与 X264
  5. 多核 linux 绑定,Linux 操作系统下CPU多核心的绑定
  6. C语言 | 二维数组
  7. 【lua学习】5.栈和lua_State
  8. php模块安装 pdo_mysql_关于php插件pdo_mysql的安装
  9. js 转化为实体符_js转html实体的方法
  10. python去除图像光照不均匀_CVPR 2020 | 从重建质量到感知质量:用于低光照增强的半监督学习方法...