JVM及调优
1.Java虚拟机内存区域划分(重要):方法区、堆 虚拟机栈、本地方法栈、程序计数器
(1)程序计数器:当前线程执行代码的行号
(2)虚拟机栈(-Xss):线程私有,每个方法执行时都会创建一个栈帧用于存储局部变量表,栈中存放各种基本数据类型和对象的引用
(3)本地方法栈:本地方法栈保存native方法信息,jvm线程中调用native方法时通过动态链接直接调用
(注意:一个线程调用方法只有一个栈;本地方法栈、程序计数器、虚拟机栈运行时数据区线程私有,堆和方法区在所有线程间共享)
(4)堆:堆包含年轻代、老年代,新生代和老年代比例1:2
①年轻代:包含Eden、Survivor0、Survivor1,内存大小分配为8:1:1。新建的实例会放先放在eden中,eden空间满后触发MinorGC,存活的对象移入Survivor0;eden空间再次满后触发MinorGC,eden区和Survivor0区存活的对象会被移入Survivor1.这样保证一段时间内总有一个survivor为空。
②老年代:新建的对象实例初始年龄为0,每活过一个MinorGC年龄加1,当年龄达到15则将该对象移入老年代。当老年代空间满后会进行fullGC,导致stw,系统会停止所有工作线程等待整个堆进行垃圾回收,需尽量避免
(5)方法区:也称永久代(一般进行大小的限制),存储已被虚拟机加载的类信息,常量,静态方法等,在JDK1.8时被取消,而提出了元空间的概念来代替它的功能。这么做主要是避免OOM的出现。此外是为了融合HotSpotJVM和JRockit,但JRocki