JVM
Posted springxian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM相关的知识,希望对你有一定的参考价值。
1、面试JVM借鉴 (学习:B站:狂神说)
JVM原型
理解各个区域
栈
首先栈是由一个个栈帧组成,栈不可以阻塞(线程级别)
栈内存中是由一个个栈帧组成
栈里都有啥
-
8大基本类型
-
对象引用
-
实例的方法(递归的本质就是压栈,弹栈)
方法区
方法区是特殊的堆,所有线程共享,所有定义的方法的信息
方法区里都有啥
-
静态变量(static)
-
常量(final)
-
类信息(构造方法、接口定义)
-
运行时的常量池
堆
一个JVM只有一个堆内存(栈是线程级的),堆内存的大小是可以调节的(一般堆内存都给定最大最小值为相同的值,防止内存抖动影响性能)
堆内存里都有啥
实例化的对象
堆内存详解
元空间 逻辑上存在,实际不存在
垃圾回收GC
首先,对象出生再伊甸园区
- 假设
伊甸园区
只能存一定数量的对象,则每当存满时就会触发一次轻GC(Minor GC)
轻GC
清理后,有的对象可能还存在引用,就活下来了,活下来的对象就进入幸存区
;有的对象没用了,就被GC清理掉了;每次轻GC
都会使得伊甸园区
为空- 如果
幸存区
和伊甸园
都满了,则会进入老年代
,如果老年代
满了,就会触发一次重GC(FullGC)
,年轻代+老年代
的对象都会清理一次,活下的对象就进入老年代
- 如果
新生代
和老年代
都满了,则OOM
Minor GC:伊甸园区满时触发;从年轻代回收内存
Full GC:老年代满时触发;清理整个堆空间,包含年轻代和老年代
Major GC:清理老年代
清理的条件
引用为null,引用被赋新值,没有引用指向
-
每个对象在创建的时候,就给这个对象绑定一个计数器。
-
每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。
-
这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作。
GC算法
引用计数
垃圾,不要用
复制算法
年轻代常用方法,浪费一半内存空间
标记-清除
产生内存碎片,扫描两次
不需要额外的空间
标记-整理
扫描三次(标记->清除->压缩)
再次优化
在内存空间足够的时候用标记清除算法,碎片足够多的时候进行压缩算法
没有最好的算法,只有最适合你的算法
以上是关于JVM的主要内容,如果未能解决你的问题,请参考以下文章