jvm 内存管理

jvm 内存模型

一.内存模型概念

  • jvm内存是指jvm虚拟机运行时从物理机获取到的一块内存,该内存由jvm使用并管理。
  • 内存模型图:

二.内存管理

  • 内存管理通常说的就是GC。
  • 程序计数器和虚拟机栈,本地方法栈跟随着线程的创建而存在,线程结束则回收。
  • 方法区存放的基本是类加载时的各种类的对象,静态变量,常量池。这块也会被回收,常量池的常量在没有被引用时则进行回收。类的对象被回收则是要满足三个条件:
  •  该类的所有实例都被回收。
  • 该类的类加载器被回收。
  • 该类对应的java.lang.class对象没有在任何地方被引用,即无法在任何地方通过反射获得该类的对象。
  • gc主要是对堆的管理。
  • 堆划分为新生代,年老代。
  • 如何判断一个对象已死?两种算法
  • 引用记数法:当一个对象没有被任何在任何地方被引用时,则代表这个对象可以被回收。采用一个计数器记录一个对象的引用,被一个地方引用则计数器加一,被取消应用时则减一,为0时则代表可以回收。
  • 可达性算法:目前HotSpot虚拟机采用的算法,以一些不会被回收的对象作为GcRoots,对每一个存活在堆内的对象有一个引用链,当没有任何一条引用链可以抵达一个对象时,则该对象可以被回收。
  • 优缺点:引用计数法会对循环引用无效,导致内存泄漏。
  • 可作为GcRoots的对象:
  • 虚拟机栈中的对象。
  • 方法区静态属性引用的变量。
  • 方法区常量引用的对象。
  • 本地方法JNI引用的对象。
  • Java中引用的概念:强引用,软引用,弱引用,虚引用。
  • 强引用的对象不可被回收。
  • 软引用在没有足够内存时会被回收,如果内存足够则会存活。
  • 弱引用在第二次被回收时才进行真正的回收,即可以躲避一次的垃圾回收。
  • 虚引用对对象的回收没有任何影响,只是在对象被回收时可以接受到一个系统通知,从而可以做一些事情。
  • 对象采用何种算法进行回收?
  • 标记清除算法:对可以被回收的对象进行第一次标记,这时不会被真正的回收,过一段时间进行第二次标记时进行真正的对象回收。在被真正回收对象之前,一个对象的finazlize方法会被调用,这时有可能造成对象被挽救,finalize方法不推荐使用,这是Java为方便c转来的程序猿做的一次妥协。
  • 复制清除算法:同样使用两次标记,但是内存被划分为相等的两块,每次把存活的对象从当前使用的那块内存复制到另一块内存,当前的内存都被回收掉,这样做的好处在于可以避免垃圾回收造成的过多的内存碎片。但是却牺牲了一半内存。
  • Hotpot虚拟机采用:新生代划分为eden和两个survivor区,比列为8:1:1,每次可使用内存为百分之90.采用的是复制清除算法,每次存活的对象从Eden和From Survivor移动到To Survivor,然后 from survivor变为To Survivor。年老代采用标记标记清除算法。
  • 标记—整理算法:这个是在标记清除算法基础上的一个改造,唯一的不同就是在回收时将所有存活对象向一端移动,清除边界以外的内存。

猜你喜欢

转载自blog.csdn.net/m0_37948170/article/details/80290807
今日推荐