JVM:堆、栈、方法区

  1. 中内存划分

    • Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都放在其中,并且Java堆完全是自动化管理,通过垃圾收集机制,垃圾对象会自动清理,不需自己去释放。

    • 根据垃圾回收机制的不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为新生代和老年代。其中新生代存放新生的对象或者年龄不大的对象,老年代则存放老年对象。

    • 新生代分为edn区,s0区,s1区,s0和s1也被称为from和to区域,他们是两块大小相等,并且可以互相转换的空间。

    • 绝大多数情况下,对象首先分配在edn区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经过一次新生代回收,如果对象存活则他的年龄就加1,对象达到一定的年龄后,则进入老年代。

    • 举例:A a=new A();首先把对象存放到堆内存当中,发现这个A只用了一次,首先会进入新生代里边去,存放到edn区域里面,因为Java堆自动化管理,垃圾收集机制,发现这个a只用了一次,如果a又被一段代码引用,垃圾回收机制有算法,每引用一次记录一次,就会马上进入到s0或者是s1区域,一旦a这个对象引用次数非常多了,就会存放到老年代里去。

JVM:堆、栈、方法区_第1张图片
  • 总结:想一下,垃圾回收机制是回收新生代多一些还是老年代多一些,其实是回收新生代多一些,因为老年代已经稳定下来了,程序已经知道了,引用的比较多了
  1. Java、

    • Java栈是一块线程私有的空间,一个栈,一般由3部分组成:局部变量表,操作数据栈,和帧数据区
  • 局部变量表:用于报错函数的参数及局部变量
  • ** 操作数据栈**:主要保存计算过程的中间结果,同时作为计算过程中的变量临时的存储空间。
  • 帧数据区: 除了局部变量表和操作数据栈以外,栈还需要一些数据来支持常量池的解析,这里帧数据区保存着访问常量池的指针,方便程序访问常量池,另外当函数返回或出现异常时,虚拟机必须有一个异常处理表,方便发送异常的时候找到异常的代码,因此异常处理表也是帧数据区的一部分。
    JVM:堆、栈、方法区_第2张图片
  1. Java、方法区

    • Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的类信息,比如类的字段,方法,常量池等,方法区的大小决定系统可以保存多少个类,如果系统定义太多个类,导致方法区溢出,虚拟机同样会抛出内存溢出的错误,方法区可以理解为永久区
  • 举例: static int a=10;因为从来不会修改,也称之为永久区的一个概念。
  • Good Luck!

你可能感兴趣的:(JVM:堆、栈、方法区)