JVM理解

作者: 不偏不倚就是你 | 来源:发表于2017-11-24 13:44 被阅读0次
    1. JAVA的内存管理 20141116162607156.png

    Object o = new Object();
    o.name = "com"
    对象Object存在于堆中,变量o存在于栈中,变量o指向于堆中的Object对象,方法执行完(生命周期走完),即被回收掉,类比,此比喻不一定对,一个函数中的变量可以作为一个栈,声明的时候放入栈中,函数结束的时候从栈里面移除。
    “com”存在于常量池里面,对象的属性name指向这个常量池,这个name是跟随者Object对象,并不是作为变量存到栈中(这个需要后续验证,暂时这么理解)

    引用一篇文章里面的说法:
    堆区:
    1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
    2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
    栈区:
    1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
    2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
    3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
    方法区:
    1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
    2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

    而Java的GC主要就是针对于堆的处理,根据是否被引用来决定在存储区域满了之后需要触发GC时,要不要回收,堆的回收分为old和young,新建对象放入young中,存活到达一定时间后,放入old中,目的是为了减低GC成本,因为能放到old中,一定的被引用的次数比较多,能被回收的概率也就越低,所以就不必一直触发
    参考文章:http://www.importnew.com/17770.html
    http://blog.csdn.net/OyangYujun/article/details/41173747
    https://www.cnblogs.com/whgk/p/6138522.html(推荐)

    虚拟机栈:


    image

    当在main方法中调用别的方法时,就会有另一个方法的栈帧入虚拟机栈,当该方法调用完了之后,弹栈,然后main方法处于栈顶,就继续执行,直到结束,然后main方法栈帧也弹栈,程序就结束了。总之虚拟机栈中就是有很多个栈帧的入栈出栈,栈帧中存放的都市一些变量名等东西,所以我们平常说栈中存放的是一些局部变量,因为局部变量就是在方法中。也就是在栈帧中,就是这样说过来的。

    相关文章

      网友评论

          本文标题:JVM理解

          本文链接:https://www.haomeiwen.com/subject/dhwxbxtx.html