JVM(JAVA virtual Machine)是能够运行Java代码的假想计算机,他是运行在操做系统上的。每一种平台的解释器不一样,可是实现的虚拟机是相同的,这也就是Java为何可以跨平台的缘由了。算法
JVM容许一个应用并发执行多个线程。当线程本地储存,缓冲区分配,栈,程序计数器准备好后,就会建立一个操做系统原生线程。Java线程结束,原生线程随之被回收, 同时释放全部相关资源。数组
生命周期与线程相同,用户线程启动/结束,而建立/销毁并发
线程共享区随虚拟机的启动/关闭,而建立/销毁操作系统
新生代通常用来存放新生的对象,占据堆1/3的空间,会频繁触发MinorGC。线程
MinorGC采用复制算法,首先把eden,survivorFrom的存活对象复制到survivorTo区,再把他们的年龄+1。接下来清空eden,survivorFrom中的对象,并把survivorTo 和 survivorFrom互换,原survivorTo内的对象会成为下一次GC的survivorFrom区。对象
老年代对象稳定,通常在执行MajorGC前都会进行一次MinorGC。 MajorGC采用标记清除算法,扫面全部对象,标记存活对象后回收全部没有标记的对象。生命周期
GC不会在主程序运行期间对永久区进行清理,因此可能出现随着加载class的增多而抛出OOM异常的情况内存
JAVA8中,永久代已经移除,被元数据区取代。他并不在虚拟机中,而是使用本地内存。这样,元数据区的大小仅受本地内存限制资源