登录  /  注册
首页 > Java > java教程 > 正文

JVM的内存分配方式介绍

青灯夜游
发布: 2019-03-28 13:34:46
转载
3339人浏览过

本篇文章给大家带来的内容是介绍jvm的内存分配方式,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

前言

本篇讲解在java程序运行时,内存的分配是怎样进行的?

java虚拟机编译时的内存存储有三类:

1、静态(方法区)存储

2、栈式存储

3、堆式存储

静态存储是指在编译的时候就得确定这个数据的存储需求,然后给它分配固定的内存,所以说静态存储不允许有可变的数据结构出现,因为可变的数据不会确定存储空间

栈式存储相比于静态存储正好相反,在编译时,栈式存储指定的存储数据是不确定的,只有真正运行到这个数据的时候才知道,那时候才能为它分配内存空间

堆式存储相对于栈式存储,栈式存储在分配空间前必须指定数据要分配多少内存,而堆式存储则完全无法确定数据结构需要的内存空间,比如可变数组,对象实例,所以堆是由大片的可利用块和空闲块组成

栈和堆

静态存储相对简单,所以我们着重分析栈和堆的关系和区别

区别
在栈中的数据一旦超过它的作用域之后,就会被释放,内存会被其他数据占用
在堆中,分配的内存是由java虚拟机自动垃圾回收器管理,这些可变数组、对象在没有引用变量指向他们的时候,才会变成垃圾,但仍然占着内存,之后再一个不确定的时间被垃圾回收器释放掉

在一个JVM实例中,堆区只有一个,而栈可以有多个

关系
在堆中创建一个数据之后,可以在栈中定义一个变量,这个变量指向堆中的某个数据(指向数据的首地址),也就是说这个变量变成了堆中数据的引用变量,可以利用引用变量来访问堆中的数据,这就是java的指针。

并且每个java应有都会有一个JVM实例,每个实例对应一个堆,在这个应有运行期间,所有的类实例和数组都放在这个堆中,在建立一个对象的时候会从两个地方分配内存,在堆中是这个对象的实际值,而在栈(堆栈,也叫stack)中,分配的是堆中这个对象的索引

堆栈(stack)

先看下这张图(嗯    画的很形象)

1.png

JVM是基于堆栈的,每新建一个线程会分配一个堆栈,它是以帧为单位,有先进后出的特性(看图可懂)

当激活一个java方法时,就为往堆栈中放入一个帧(这就是压栈),在这个方法的执行过程中,这个帧就会用来保存数据

方法的存在有堆栈决定,而由于先进后出的形式,方法之间嵌套的越深,stack的内存就越难释放,所以递归这样的方法本人不推荐使用

下面贴出压栈和出栈的具体实现

使用压栈出栈来将字符串倒序

String value = "test 1234567890";
StringBuffer result = new StringBuffer();
 
Stack stack = new Stack();
 
for(char c : value.toCharArray()) {
  stack.push(c);
}
 
while (!stack.empty()) {
  result.append(stack.pop());
}
 
value = result.toString();
登录后复制

相关视频教程推荐:《Java教程

以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。更多精彩内容大家可以关注php中文网相关教程栏目!!!

以上就是JVM的内存分配方式介绍的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:segmentfault 思否网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号