1.什么是JVM
jvm是运行在JDK的底层,负责和操作系统交互,用来屏蔽操作系统环境,提供完整的java运行环境。
操作系统装入jvm是通过jdk的java.exe来完成的。
2.JVM 内存模型(jdk8)
线程私有:程序计数器,虚拟机栈,本地方法栈
线程共享:元空间,JAVA堆
3.JAVA内存模型中堆和栈的区别
·栈自动释放,堆需要GC回收
·堆比栈的内存空间要大
·栈产生的内存碎片远小于堆,对会产生更多的内存碎片
·栈支持静态和动态分配,堆只支持动态分配
·栈的效率比堆要高
*存放的内容的区别
栈:函数中定义的基本类型变量;对象引用的变量;
堆:new产生的对象和数组;
*回收方式
栈:自动回收。函数体中定义的变量,如果超过了函数体将自动回收
堆:有GC垃圾回收器回收
4.JVM内存模块
jvm的内存模块主要分两大类:NEW Generation(新生代)和Old Generation(老年代)
4.1新生代中有一个Eden(原生代)空间,主要是用来存放新创建的对象;要有两个Survivor Spaces(幸存者区)[from,to]
分别是存放每次垃圾回收后存活下来的对象
4.2在老生代:用来存放应用程序中生命周期长的内存对象,就是在幸存者区多次垃圾回收后依然存活的对象。
4.3jvm垃圾回收的过程:
在新生代(NEW Generation)块中,每次GC存活下来的对象
首先,由Eden拷贝某个Survivor Space
其次,当Survivor Space空间满后,剩下的live对象被直接拷贝到Old Generation中。
最后,每次GC后,Eden内存块都会被清空,
(注:内存溢出通常发生于OLD段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。)
5.JVM三大性能调优的参数
三大性能调优参数 -Xms -Xmx -Xss的含义
-Xms:堆的初始值
-Xmx:堆能达到的最大值
-Xss:规定了每个线程虚拟机栈的大小
6.GC垃圾回收算法
6.1复制算法发生在新生代,幸存者区垃圾回收时使用,适用于存活率较低对象。Minor GC
6.2老年代的回收,标记整理算法。适用于存活率较高的对象回收;Full GC
注:System.gc() 会回收老年代的垃圾,但不会立即回收。