JVM的内存分配方式是什么
JVM的内存分配方式是什么?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
成都创新互联专注于黑河网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供黑河营销型网站建设,黑河网站制作、黑河网页设计、黑河网站官网定制、成都微信小程序服务,打造黑河网络公司原创品牌,更为您提供黑河网站排名全网营销落地服务。
java虚拟机编译时的内存存储有三类:
1、静态(方法区)存储
2、栈式存储
3、堆式存储
静态存储是指在编译的时候就得确定这个数据的存储需求,然后给它分配固定的内存,所以说静态存储不允许有可变的数据结构出现,因为可变的数据不会确定存储空间
栈式存储相比于静态存储正好相反,在编译时,栈式存储指定的存储数据是不确定的,只有真正运行到这个数据的时候才知道,那时候才能为它分配内存空间
堆式存储相对于栈式存储,栈式存储在分配空间前必须指定数据要分配多少内存,而堆式存储则完全无法确定数据结构需要的内存空间,比如可变数组,对象实例,所以堆是由大片的可利用块和空闲块组成
栈和堆
静态存储相对简单,所以我们着重分析栈和堆的关系和区别
区别:
在栈中的数据一旦超过它的作用域之后,就会被释放,内存会被其他数据占用
在堆中,分配的内存是由java虚拟机自动垃圾回收器管理,这些可变数组、对象在没有引用变量指向他们的时候,才会变成垃圾,但仍然占着内存,之后再一个不确定的时间被垃圾回收器释放掉
在一个JVM实例中,堆区只有一个,而栈可以有多个
关系
在堆中创建一个数据之后,可以在栈中定义一个变量,这个变量指向堆中的某个数据(指向数据的首地址),也就是说这个变量变成了堆中数据的引用变量,可以利用引用变量来访问堆中的数据,这就是java的指针。
并且每个java应有都会有一个JVM实例,每个实例对应一个堆,在这个应有运行期间,所有的类实例和数组都放在这个堆中,在建立一个对象的时候会从两个地方分配内存,在堆中是这个对象的实际值,而在栈(堆栈,也叫stack)中,分配的是堆中这个对象的索引
堆栈(stack)
先看下这张图(嗯 画的很形象)
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();
感谢各位的阅读!看完上述内容,你们对JVM的内存分配方式是什么大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注创新互联行业资讯频道。
名称栏目:JVM的内存分配方式是什么
网站链接:http://ybzwz.com/article/gsegho.html