首页 > 编程知识 正文

操作系统中 heap 和 stack 的区别,heap stack 区别

时间:2023-05-03 06:23:41 阅读:208920 作者:1641

1、java堆

     java堆是用于存储java对象的内存区域,堆的大小在JVM启动时就一次向操作系统申请完成,通过-Xmx和-Xms两个选项来控制大小,Xmx表示堆的最大大小,Xms表示初始大小。一旦分配完成,堆的大小就将固定,不能在内存不够时再向操作系统重新申请,同时当内存空闲时也不能将多余的空间交还给操作系统,

在java堆中内存空间的管理由JVM控制,对象创建由JAVA应用程序控制,但是对象所占的空间释放由管理堆内存的垃圾收集器完成,根据垃圾收集(GC)算法的不同,内存的回收方式和时机也不同,

 2、java 栈 java栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的java栈,在这个java栈中又会含有多个栈帧,这些栈帧是与每个方法关联起来的,每运行一个方法就创建一个栈帧,每个栈帧会含有一些内部变量(在方法内定义的变量)、操作栈和方法返回值等信息。    每当一个方法执行完毕时,这个栈祯就会弹出栈帧的元素作为这个方法的返回值,并清除这个栈帧,java栈的栈顶的栈帧就是当前正在执行的活动栈,也就是当前正在执行的方法,PC寄存器也会执行这个地址,只有这个活动的栈帧的本地变量可以被操作栈使用,当在这个栈帧中调用另一个方法时,与之对应的一个新的栈帧又被创建,这个新创建的栈帧又被放到java栈的顶部,变为当前活动的栈帧,同样现在只有这个栈帧的本地变量才能被使用,当在这个栈帧中所有指令执行完成时这个栈帧移出java栈,刚才的那个栈帧又变为活动栈帧,前面的栈帧的返回值又变为这个栈帧的操作栈中的一个操作数,如果前面的栈帧没有返回值,那么当前的栈帧的操作栈的操作数没有变化。  由于java栈是与java线程对应起来的,这个数据不是线程共享的,所以我们不用关系它的数据一致性问题,也不会存在同步锁的问题


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。