Hot Spot VM内存模型

读《深入理解Java 虚拟机》,感觉里面叙述的不错,这里是本人一些对于此书描述的知识点的总结。

Java运行时内存模型:

Hot Spot VM内存模型_第1张图片

这里是原书的一个图,虚拟机栈是Java方法调用的时候用的数据结构.
例如:

  public class node{
         private int functionA(){
              int a=5;
              int b=6;
              return functionB(a+b);
         }
        private int functionB(int arg){
           int temp=arg+arg/10;
           return temp;
        }
        public static void main(String[] args){
            new node().functionA();
       }
  }

其函数栈的结构如下图:
每个函数调用,增加一个栈帧,当执行完一个函数返回后,栈顶栈帧出栈。
不过重点不在于函数调用的结构,而是函数调用中,虚拟机对于函数域中
各个字段的组织:

Hot Spot VM内存模型_第2张图片

上面的放大图是局部变量表的数据组织细节,一个单位矩形是一个数据槽(slot)

GC机制

这里GC机制,我就不系统叙述,而是关注几个读书时几个重要概念:

内存泄露和内存溢出的区别
内存泄漏是不该继续在栈中的对象通过引用链和根相连接,导致GC回收不了它,继续耗用堆空间。
内存溢出是因为堆空间不能满足程序的存储需求。

关于直接内存
因为NIO的引入,Java申请的内存可以不在VM的管理之下;
也就是说,执行Native函数库调用的Java程序可以直接越过它的上级,
越级像普通进程一样申请内存资源。

因为原来的内存申请手续是,VM作为一个进程运行在操作系统中,运行于虚拟机上的Java程序如果需要内存,那么它会在堆中申请一块,而堆的内存是VM作为OS上的一个进程的身份申请的!

关于几句话描述GC算法:
mark-sweep:
不可达对象标记,标记后清除
copying:
将堆化成两块,标记不可达对象,将可达对象复制到另一块,本块同一重置。
这里有一个变种就是Eden-Dsurvivor.
mark-compact:
标记不可达对象,标记后清除,移动内存块,消除碎片。

几个最常用的虚拟机参数:

-Xms  //堆最小值
-Xmx  //堆最大值
-Xmn  //设置堆中年轻代大小

你可能感兴趣的:(Java,EE,SE)