周二更多比赛: 韩k联 浦项制铁 vs 济州联队 亚洲彩票网投, 土超 卡拉古拉克 vs卡斯帕萨 , 土超 锡瓦斯体育 vs开塞利体育 ,解放杯 巴拉纳竞技 v...
近日,新疆男篮球员都麟在私东说念主外交媒体上晒出了我方最新的个东说念主熟悉照。从图中咱们不错看出,都麟并莫得去海外进行个东说念主熟悉,而是在国内进行了熟悉。从图...
乐鱼色碟乐鱼色碟博彩平台游戏促销活动 位于土耳其南部的哈塔伊省(Hatay)领少见之不尽的古罗马和拜占庭艺术文化瑰宝新2足球平台网站出租,同期这里坐落着现辞寰宇...
不管你是博彩新手还是老手,皇冠体育都可以为你提供全方位的博彩服务,包括各种优惠活动、高额奖金、专业的博彩技巧等等,让你在博彩世界中游刃有余。排列三捕鱼博彩平台游...
太阳城官网博彩平台自助服务_ 一又友值得沿途过一辈子。他们裕如爱怜心,也王人懂得包容对方,尤其是在厚谊中,频频会给对方宽裕的空间亚星现金网,毫不会咄咄逼东说念主...
太阳城娱乐电子游戏在《Java凭空机步履》的法例里太阳城娱乐电子游戏,除了面孔计数器外,凭空机内存的其他几个运行时区域皆有发生 OutOfMemoryError 特殊的可能。 博彩平台注册送彩金皇冠盘口瀚希体育[[332758]] 本篇主要包括如下 OOM 的先容和示例: java.lang.StackOverflowError java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC overhead limit exceeded java.lang.OutOfMemoryError-->Metaspace java.lang.OutOfMemoryError: Direct buffer memory java.lang.OutOfMemoryError: unable to create new native thread java.lang.OutOfMemoryError:Metaspace java.lang.OutOfMemoryError: Requested array size exceeds VM limit java.lang.OutOfMemoryError: Out of swap space java.lang.OutOfMemoryError:Kill process or sacrifice child咱们常说的 OOM 特殊,其实是 Error 一. StackOverflowError 1.1 写个 bug public class StackOverflowErrorDemo { public static void main(String[] args) { javaKeeper(); } private static void javaKeeper() { javaKeeper(); } } JVM 凭空机栈是有深度的,在实行方法的时候会伴跟着入栈和出栈,上边的方法不错看到,main 方法实行后阻挡的递归,早晚把栈撑爆了 广西玉林新闻网Exception in thread "main" java.lang.StackOverflowError at oom.StackOverflowErrorDemo.javaKeeper(StackOverflowErrorDemo.java:15) 1.2 原因分析 无尽递归轮回调用(最常原宥因),要技能留心代码中是否有了轮回调用方法而无法退出的情况 实行了精深方法,导致线程栈空间破钞 方法内声明了海量的局部变量 native 代码有栈上分拨的逻辑,而况条目的内存还不小,比如 java.net.SocketInputStream.read0 会在栈上条目分拨一个 64KB 的缓存(64位 Linux)1.3 惩办决策 建造激励无尽递归调用的特殊代码, 通过面孔抛出的特殊堆栈,找出持续重叠的代码行,生搬硬套,建造无尽递归 Bug 排查是否存在类之间的轮回依赖(当两个对象互相援用,在调用toString方法时也会产生这个特殊) 通过 JVM 启动参数 -Xss 加多线程栈内存空间, 某些平素使用场景需要实行精深方法或包含精深局部变量,这时不错合适地普及线程栈空间罢休二. Java heap space Java 堆用于存储对象实例,咱们独一持续的创建对象,而况保证 GC Roots 到对象之间有可达旅途来幸免 GC 吊销这些对象,那跟着对象数量的加多,总容量涉及堆的最大容量罢休后就会产生内存溢出特殊。 Java 堆内存的 OOM 特殊是实质应用中最常见的内存溢出特殊。 感谢亲爱家人们,一起经历风雨,见证岁月,安放所有喜乐苦悲。遥遥相伴,陪越过层层山丘;默默守护,带跨出丛丛荆棘。感谢亲爱伙伴们,一种浪漫叫并肩作战,一种纯粹叫全力以赴,一种果敢叫奋不顾身,回首此间,满是静水流深情义雷霆万钧担当。感谢亲爱同事们,虽然分别已久,真挚鼓励持续坚守,始终风雨同舟,艰难征程波澜壮阔,赤诚初心历久弥坚。感谢所有关心,就算素未谋面,浓浓情意、切切问候深深祝福,一道彩虹,斑斓坎坷路途一隅天空。2.1 写个 bug /** * JVM参数:-Xmx12m */ public class JavaHeapSpaceDemo { static final int SIZE = 2 * 1024 * 1024; public static void main(String[] a) { int[] i = new int[SIZE]; } } 代码试图分拨容量为 2M 的 int 数组,如若指定启动参数 -Xmx12m,分拨内存就不够用,就近似于将 XXXL 号的对象,往 S 号的 Java heap space 里面塞。 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at oom.JavaHeapSpaceDemo.main(JavaHeapSpaceDemo.java:13) 2.2 原因分析 请求创建一个超大对象,凡俗是一个大数组 超出预期的探望量/数据量,凡俗是上游系统请求流量飙升,常见于种种促销/秒杀活动,不错相连业务流量贪图排查是否有尖状峰值 过度使用终结器(Finalizer),该对象莫得立即被 GC 内存泄漏(Memory Leak),精深对象援用莫得开释,JVM 无法对其自动回收,常见于使用了 File 等资源莫得回收2.3 惩办决策 针对大部分情况,凡俗只需要通过 -Xmx 参数调高 JVM 堆内存空间即可。如若仍然莫得惩办,不错参考以下情况作念进一步处理: 如若是超大对象,不错查验其合感性,比如是否一次性查询了数据库一谈驱逐,而莫得作念驱逐数罢休 如若是业务峰值压力,不错商量添加机器资源,简略作念限流左迁。 如若是内存泄漏,需要找到捏有的对象,修改代码联想,比如关闭莫得开释的结合口试官:说说内存泄漏和内存溢出 加送个学问点,三连的终将成为大神~~ 内存泄漏和内存溢出 内存溢出(out of memory),是指面孔在央求内存时,莫得填塞的内存空间供其使用,出现out of memory;比如央求了一个 Integer,但给它存了 Long 才能存下的数,那便是内存溢出。 内存泄漏( memory leak),是指面孔在央求内存后,无法开释已央求的内存空间,一次内存泄漏危害不错忽略,但内存泄漏堆积后果很严重,无论若干内存,早晚会被占光。 皇冠hg86amemory leak 最终会导致 out of memory! 三、GC overhead limit exceeded JVM 内置了垃圾回收机制GC,是以行为 Javaer 的咱们不需要手工编写代码来进行内存分拨和开释,但是当 Java 程度破耗 98% 以上的技能实行 GC,但只收复了不到 2% 的内存,且该动作连气儿重叠了 5 次,就会抛出 java.lang.OutOfMemoryError:GC overhead limit exceeded 诞妄(俗称:垃圾回收上面)。肤浅地说,便是应用面孔依然基本破钞了通盘可用内存, GC 也无法回收。 假如不抛出 GC overhead limit exceeded 诞妄,那 GC 计帐的那么一丢丢内存很快就会被再次填满,迫使 GC 再次实行,这样恶性轮回,CPU 使用率 100%,而 GC 没什么后果。 3.1 写个 bug 出现这个诞妄的实例,其实咱们写个无尽轮回,往 List 或 Map 加数据就会一直 Full GC,直到扛不住,这里用一个退却易发现的栗子。咱们往 map 中添加 1000 个元素。 /** * JVM 参数: -Xmx14m -XX:+PrintGCDetails */ public class KeylessEntry { static class Key { Integer id; Key(Integer id) { this.id = id; } @Override public int hashCode() { return id.hashCode(); } } public static void main(String[] args) { Map m = new HashMap(); while (true){ for (int i = 0; i < 1000; i++){ if (!m.containsKey(new Key(i))){ m.put(new Key(i), "Number:" + i); } } System.out.println("m.size()=" + m.size()); } } } ... m.size()=54000 m.size()=55000 m.size()=56000 Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 从输出驱逐不错看到,咱们的罢休 1000 条数据莫得起作用,map 容量远特出了 1000,而且临了也出现了咱们思要的诞妄,这是因为类 Key 只重写了 hashCode() 方法,却莫得重写 equals() 方法,咱们在使用 containsKey() 方法其实就出现了问题,于是就会一直往 HashMap 中添加 Key,直至 GC 皆计帐不掉。 口试官又来了:说一下HashMap旨趣以及为什么需要同期末端equals和hashcode 香港六合彩轮盘实行这个面孔的最终诞妄,和 JVM 竖立也会联系系,如若诞生的堆内存极度小,皇冠开户会成功报 Java heap space。算是被这个诞妄截胡了,是以就怕,在资源受限的情况下,无法准确展望面孔会死于哪种具体的原因。 3.2 惩办决策 添加 JVM 参数-XX:-UseGCOverheadLimit 不推选这样干,莫得的确惩办问题,仅仅将特殊推迟 查验风物中是否有精深的死轮回或有使用大内存的代码,优化代码 dump内存分析,查验是否存在内存泄漏,如若莫得,加大内存四、Direct buffer memory 咱们使用 NIO 的时候频繁需要使用 ByteBuffer 来读取或写入数据,这是一种基于 Channel(通谈) 和 Buffer(缓冲区)的 I/O 方式,它不错使用 Native 函数库成功分拨堆外内存,然后通过一个存储在 Java 堆里面的 DirectByteBuffer 对象行为这块内存的援用进行操作。这样在一些场景就幸免了 Java 堆和 Native 中来恢复制数据,是以性能会有所普及。 Java 允许应用面孔通过 Direct ByteBuffer 成功探望堆外内存,许多高性能面孔通过 Direct ByteBuffer 相连内存映射文献(Memory Mapped File)末端高速 IO。 4.1 写个 bug 橄榄球 ByteBuffer.allocate(capability) 是分拨 JVM 堆内存,属于 GC 统辖鸿沟,需要内存拷贝是以速率相对较慢; ByteBuffer.allocateDirect(capability) 是分拨 OS 腹地内存,不属于 GC 统辖鸿沟,由于不需要内存拷贝是以速率相对较快;如若持续分拨腹地内存,堆内存很少使用,那么 JVM 就不需要实行 GC,DirectByteBuffer 对象就不会被回收,这时天然堆内存充足,但腹地内存可能依然不够用了,就会出现 OOM,腹地成功内存溢出。 /** * VM Options:-Xms10m,-Xmx10m,-XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m */ public class DirectBufferMemoryDemo { public static void main(String[] args) { System.out.println("maxDirectMemory is:"+sun.misc.VM.maxDirectMemory() / 1024 / 1024 + "MB"); //ByteBuffer buffer = ByteBuffer.allocate(6*1024*1024); ByteBuffer buffer = ByteBuffer.allocateDirect(6*1024*1024); } } 最大成功内存,默许是电脑内存的 1/4,是以咱们设小点,然后使用成功内存特出这个值,就会出现 OOM。 maxDirectMemory is:5MB Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory 4.2 惩办决策 Java 只可通过 ByteBuffer.allocateDirect 方法使用 Direct ByteBuffer,因此,不错通过 Arthas 等在线会诊用具阻难该方法进行排查 查验是否成功或障碍使用了 NIO,如 netty,jetty 等 通过启动参数 -XX:MaxDirectMemorySize 调遣 Direct ByteBuffer 的上限值 查验 JVM 参数是否有 -XX:+DisableExplicitGC 选项,如若有就去掉,因为该参数会使 System.gc() 失效 查验堆外内存使用代码,证明是否存在内存泄漏;简略通过反射调用 sun.misc.Cleaner 的 clean() 方法来主动开释被 Direct ByteBuffer 捏有的内存空间 内存容量如实不及,升级竖立五、Unable to create new native thread 每个 Java 线程皆需要占用一定的内存空间,当 JVM 向底层操作系统请求创建一个新的 native 线程时,如若莫得填塞的资源分拨就会报此类诞妄。 5.1 写个 bug public static void main(String[] args) { while(true){ new Thread(() -> { try { Thread.sleep(Integer.MAX_VALUE); } catch(InterruptedException e) { } }).start(); } } Error occurred during initialization of VM java.lang.OutOfMemoryError: unable to create new native thread 5.2 原因分析 5.3 惩办决策 思主见镌汰面孔中创建线程的数量,分析应用是否竟然需要创建这样多线程 如若如实需要创建许多线程,调高 OS 层面的线程最大数:实行 ulimia-a 检察最大线程数罢休,使用 ulimit-u xxx 调遣最大线程数罢休 六、Metaspace JDK 1.8 之前会出现 Permgen space,该诞妄暗示遥远代(Permanent Generation)已用满,凡俗是因为加载的 class 数量太多或体积太大。跟着 1.8 中遥远代的取消,就不会出现这种特殊了。 Metaspace 是方法区在 HotSpot 中的末端,它与遥远代最大的别离在于,元空间并不在凭空机内存中而是使用腹地内存,但是腹地内存也有打满的时候,是以也会有特殊。 6.1 写个 bug 皇冠客服飞机:@seo3687/** * JVM Options: -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m */ public class MetaspaceOOMDemo { public static void main(String[] args) { while (true) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MetaspaceOOMDemo.class); enhancer.setUseCache(false); enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> { //动态代理创建对象 return methodProxy.invokeSuper(o, objects); }); enhancer.create(); } } } 借助 Spring 的 GCLib 末端动态创建对象 Exception in thread "main" org.springframework.cglib.core.CodeGenerationException: java.lang.OutOfMemoryError-->Metaspace 6.2 惩办决策 方法区溢出亦然一种常见的内存溢出特殊,在频繁运行时生成精深动态类的应用场景中,就应该极度和顺这些类的回收情况。这类场景除了上边的 GCLib 字节码增强和动态讲话外,常见的还有,精深 JSP 或动态产生 JSP 文献的应用(旷古时期的传统软件行业可能会有)、基于 OSGi 的应用(即使归并个类文献,被不同的加载器加载也会视为不同的类)等。 方法区在 JDK8 中一般不太容易产生,HotSpot 提供了一些参数来诞生元空间,不错起到督察作用 -XX:MaxMetaspaceSize 诞生元空间最大值,默许是 -1,暗示不罢休(照旧要受腹地内存大小罢休的) -XX:MetaspaceSize 指定元空间的驱动空间大小,以字节为单元,达到该值就会触发 GC 进行类型卸载,同期网罗器会对该值进行调遣 -XX:MinMetaspaceFreeRatio 在 GC 之后限度最小的元空间剩余容量的百分比,可减少因元空间不及导致的垃圾网罗频率,近似的还有 MaxMetaspaceFreeRatio七、Requested array size exceeds VM limit 7.1 写个 bug public static void main(String[] args) { int[] arr = new int[Integer.MAX_VALUE]; } 这个比拟肤浅,建个超等大数组就会出现 OOM,未几说了 Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit JVM 罢休了数组的最大长度,该诞妄暗示面孔请求创建的数组特出最大长度罢休。 JVM 在为数组分拨内存前,会查验要分拨的数据结构在系统中是否可寻址,凡俗为 Integer.MAX_VALUE-2。 此类问题比拟阑珊,凡俗需要查验代码,证明业务是否需要创建如斯大的数组,是否不错拆分为多个块,分批实行。 八、Out of swap space 启动 Java 应用面孔会分拨有限的内存。此罢休是通过-Xmx和其他近似的启动参数指定的。 在 JVM 请求的总内存大于可用物理内存的情况下,操作系统发轫将内容从内存换出到硬盘驱动器。 该诞妄暗示通盘可用的凭空内存已被破钞。凭空内存(Virtual Memory)由物理内存(Physical Memory)和交换空间(Swap Space)两部分构成。 欧博注册这种诞妄没见过~~~ 九、Kill process or sacrifice child 操作系统是建立在经过主见之上的。这些程度由几个内核功课认真,其中一个名为“ Out of memory Killer”,它会在可用内存极低的情况下“杀死”(kill)某些程度。OOM Killer 会对通盘程度进行打分,然后将评分较低的程度“杀死”,具体的评分法例不错参考 Surviving the Linux OOM Killer。 不同于其他的 OOM 诞妄, Killprocessorsacrifice child 诞妄不是由 JVM 层面触发的,而是由操作系统层面触发的。 [扫码下载app,中过数字彩1千万以上的专家都在这儿!] 9.1 原因分析 默许情况下,Linux 内核允许程度央求的内存总量大于系统可用内存,通过这种“错峰复用”的方式不错更有用的运用系统资源。 国家体育口号![]() 然则,这种方式也会无可幸免地带来一定的“超卖”风险。举例某些程度捏续占用系统内存,然后导致其他程度莫得可用内存。此时,系统将自动激活 OOM Killer,寻找评分低的程度,并将其“杀死”,开释内存资源。 9.2 惩办决策 升级办事器竖立/装束部署,幸免争用 OOM Killer 调优。临了附上一张“涯海”大神的图 《深切贯通 Java 凭空机 第 3 版》 https://plumbr.io/outofmemoryerror https://yq.aliyun.com/articles/711191 https://github.com/StabilityMan/StabilityGuide/blob/master/docs/diagnosis/jvm/exception 本文转载自微信公众号「JavaKeeper」,作家海星 。转载本文请商量 JavaKeeper公众号。
原文结合:https://mp.weixin.qq.com/s/gIJvtd8rrZz6ttaoGLddLg
|