首先要说Jvm,先来讲一说Jvm,Jre,JDK三者的关系吧!以下图:java
JDK:做为软件开发工做包,包含有JRE和一些工具类的包。算法
JRE:为java程序运行提供必要的环境,由JVM和Java的Api组成。服务器
JVM:简单点理解就是,经过一些规定和存储分区以及gc管理使java程序能更好的运行。多线程
---------------------------------------分割线--------------------------------------------------并发
下面就要来讲说JVM了,我按照简版的最好理解的来讲。工具
主要分为堆内存,栈内存,non Heap区。优化
比较流行的将堆分为新生代和年老代。spa
新生代分为Eden,survivor1,survovor2,内存空间分配为8:1:1。用的时候只用Eden和其中一个存活区,等到执行MinorGc的时候将未被回收的对象放到另外一个存活区中。MinorGc负责新生代的垃圾回收,执行频率高,速度比较快。线程
年老代,在新生代中通过屡次MinorGc未被回收的进入年老代。majorGc负责年老代的垃圾回收。执行频率低,速度是MinorGc的十倍之久。咱们能够经过内存配置来优化它。3d
---------------------------------------分割线--------------------------------------------------
Gc优化的参数:
咱们在配置时通常将xms和xmx配置成相等的这样能够减小MajorGc的调用,数值通常配置为可用物理内存的80%。xmn配置为Xmn的30%。配置permSize须要根据咱们部署的项目多少,以及jar包的多少来配置。若是jar包比较多,就须要配大一点。
---------------------------------------分割线--------------------------------------------------
常见的内存溢出异常:
---------------------------------------分割线--------------------------------------------------
垃圾回收算法:
---------------------------------------分割线--------------------------------------------------
常见垃圾回收器
并发:指用户线程和垃圾回收线程同时执行(不必定是并行,有多是交叉执行),用户进程在运行,而垃圾回收线程在另外一个 CPU 上运行。
纯属我的理解,不喜勿喷。。。