JVM难学?那是因为你没认真看完这篇文章
单线程下无论栈帧太大还是栈容量太小,及引用深度超过虚拟机允许深度都会抛出StackOverflowError每个方法压入栈的帧大小是不一致的。多线程下当每个线程分配栈帧太大内存不能够扩展时抛出OutOfMemoryError异常线程栈帧越大,可创建的线程越少。 3.方法区参数 -XX:PermSize方法区内存最小值 -XX:MaxPermSize 方法区内存最大值 各个线程共享的内存区域,主要用来存储类的元数据、常量、静态变量、即时编译器编译后的代码等数据 例:-XX:PermSize=20M -XX:MaxPermSize=20M 异常类型 OutOfMemoryError : 原因:常量过多,或代理反射等使用频繁 4.本机直接内存参数 -XX:MaxDirectMemorySize 例:-XX:MaxDirectMemorySize=10M 不足时抛出OutOfMemory异常 四:垃圾收集算法 经典的垃圾回收算法以下几种 一、标记--清除算法(Mark-Sweep) 回收前状态: 回收后状态: 优缺点: 算法执行分为两个阶段标记与清除,所有的回收算法,基本都 基于标记回收算法做了深度优化 缺点:效率问题,内存空间碎片(不连续的空间) 二、复制算法(Copying) 回收前状态: Eden内存空间 8 Survivor1空间(From空间)1 Survivor2空间(To空间) 1 Eden内存空间与Survivor空间 8:1 回收后状态: Survivor1空间(From空间)1 Eden内存空间与Survivor空间 8:1 优缺点: 比较标记清除算法,避免了回收造成的内存碎片问题, 缺点:以局部的内存空间牺牲为代价,不过空间的浪费比较小,默认8:1的比例1是浪费的。 复制也有一定的效率与空间成本 三、标记整理算法(Mark-Compact) 回收前状态: 回收后状态: 优缺点: 避免了,空间的浪费,与内存碎片问题。 缺点:整理时复制有效率成本。 五:垃圾收集器 一、七种垃圾收集器 (1) Serial(串行GC)-XX:+UseSerialGC (2) ParNew(并行GC)-XX:+UseParNewGC (3) Parallel Scavenge(并行回收GC) (4) Serial Old(MSC)(串行GC)-XX:+UseSerialGC (5) CMS(并发GC)-XX:+UseConcMarkSweepGC (6) Parallel Old(并行GC)-XX:+UseParallelOldGC (7) G1(JDK1.7update14才可以正式商用) 二.1~3用于年轻代垃圾回收:年轻代的垃圾回收称为minor GC 三.4~6用于年老代垃圾回收(当然也可以用于方法区的回收):年老代的垃圾回收称为full GC G1独立完成"分代垃圾回收" 注意:并行与并发 并行:多条垃圾回收线程同时操作 并发:垃圾回收线程与用户线程一起操作 四、常用五种组合 Serial/Serial Old ParNew/Serial Old:与上边相比,只是比年轻代多了多线程垃圾回收而已 ParNew/CMS:当下比较高效的组合 Parallel Scavenge/Parallel Old:自动管理的组合 G1:最先进的收集器,但是需要JDK1.7update14以上 五. Serial/Serial Old 年轻代Serial收集器采用单个GC线程实现"复制"算法(包括扫描、复制) 年老代Serial Old收集器采用单个GC线程实现"标记-整理"算法 Serial与Serial Old都会暂停所有用户线程(即STW) 说明: STW(stop the world):编译代码时为每一个方法注入safepoint(方法中循环结束的点、方法执行结束的点),在暂停应用时,需要等待所有的用户线程进入safepoint,之后暂停所有线程,然后进行垃圾回收。 适用场合: CPU核数<2,物理内存<2G的机器(简单来讲,单CPU,新生代空间较小且对STW时间要求不高的情况下使用) -XX:UseSerialGC:强制使用该GC组合 -XX:PrintGCApplicationStoppedTime:查看STW时间 六.ParNew/Serial Old: (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |