当前位置: 首页 > news >正文

东莞网站设计流程徐州专业做网站

东莞网站设计流程,徐州专业做网站,绮思网站建设qswoo,网站没备案或与实际备案不符深入解析 OOM 的三大场景 什么是 OOM#xff1f;一、堆内存溢出 ( Heap OOM )原因分析解决方案 二、栈内存溢出#xff08;Stack OOM#xff09;原因分析解决方案 三、方法区内存溢出#xff08;Metaspace OOM#xff09;原因分析解决方案 在Java应用程序开发中#xff0… 深入解析 OOM 的三大场景 什么是 OOM一、堆内存溢出 ( Heap OOM )原因分析解决方案 二、栈内存溢出Stack OOM原因分析解决方案 三、方法区内存溢出Metaspace OOM原因分析解决方案 在Java应用程序开发中OutOfMemoryErrorOOM是一个令人头痛的问题。当JVM中的内存无法满足应用程序的需求时就会抛出这个错误。本文将深入探讨OOM的三大场景堆内存溢出、方法区内存溢出和栈内存溢出并分析它们的原因提供相应的实战解决方案。 什么是 OOM OOM 的全称是 Out Of Memory那我们的内存区域有哪些会发生 OOM 呢我们可以从内存区域划分图上看一下彩色部分 可以看到除了程序计数器其他区域都有OOM溢出的可能。但是最常见的还是发生在堆内存溢出、方法区内存溢出和栈内存溢出主要是在堆上。 另外我们常说的 OOM 异常其实是 Error 一、堆内存溢出 ( Heap OOM ) Java 堆用于存储对象实例我们只要不断的创建对象并且保证 GC Roots 到对象之间有可达路径来避免 GC 清除这些对象那随着对象数量的增加总容量触及堆的最大容量限制后就会产生内存溢出异常。 Java 堆内存的 OOM 异常是实际应用中最常见的内存溢出异常。 /*** JVM参数-Xmx10m*/ public class JavaHeapSpaceDemo {static final int SIZE 100 * 1024 * 1024;public static void main(String[] a) {int[] i new int[SIZE];} }代码试图分配容量为 100M 的 int 数组如果指定启动参数 -Xmx10m分配内存就不够用就类似于将 XXXL 号的对象往 S 号的 Java heap space 里面塞。 原因分析 对象过多应用程序创建了大量的对象并且这些对象长时间存活导致堆内存不足。内存泄漏应用程序中存在内存泄漏即长时间无法释放不再使用的对象导致堆内存持续占用。超出预期的访问量/数据量通常是上游系统请求流量飙升常见于各类促销/秒杀活动可以结合业务流量指标排查是否有尖状峰值 解决方案 针对大部分情况通常只需要通过 -Xmx 参数调高 JVM 堆内存空间即可。如果仍然没有解决可以参考以下情况做进一步处理 优化代码减少不必要的对象创建避免过大的集合和数组。如果是内存泄漏需要找到持有的对象修改代码设计比如关闭没有释放的连接如果是业务峰值压力可以考虑添加机器资源或者做限流降级。 二、栈内存溢出Stack OOM 栈内存溢出通常与线程的执行和递归调用有关。 public class StackOverflowErrorDemo {public static void main(String[] args) {javaKeeper();}private static void javaKeeper() {javaKeeper();} }原因分析 递归调用过深最常见原因递归算法实现不当导致递归深度过大超出了线程栈的大小限制。线程创建过多应用程序创建了大量的线程并且每个线程的栈内存分配过多导致系统资源耗尽。 解决方案 修复引发无限递归调用的异常代码 通过程序抛出的异常堆栈找出不断重复的代码行按图索骥修复无限递归 Bug 排查是否存在类之间的循环依赖 通过 JVM 启动参数 -Xss 增加线程栈内存空间 某些正常使用场景需要执行大量方法或包含大量局部变量这时可以适当地提高线程栈空间限制 三、方法区内存溢出Metaspace OOM 方法区内存溢出通常与类的加载和元数据的存储有关。 JDK 1.8 之前会出现 Permgen space该错误表示永久代Permanent Generation已用满通常是因为加载的 class 数目太多或体积太大。随着 1.8 中永久代的取消就不会出现这种异常了。 Metaspace 是方法区在 HotSpot 中的实现它与永久代最大的区别在于元空间并不在虚拟机内存中而是使用本地内存但是本地内存也有打满的时候所以也会有异常。 /*** JVM Options: -XX:MetaspaceSize10m -XX:MaxMetaspaceSize10m*/ 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方法区溢出也是一种常见的内存溢出异常在经常运行时生成大量动态类的应用场景中就应该特别关注这些类的回收情况。这类场景除了上边的 GCLib 字节码增强和动态语言外常见的还有大量 JSP 或动态产生 JSP 文件的应用远古时代的传统软件行业可能会有、基于 OSGi 的应用即使同一个类文件被不同的加载器加载也会视为不同的类等。 原因分析 加载过多的类每个类在加载到JVM时都会占用一定的方法区空间。如果程序加载了大量的类那么方法区可能会被占满导致OOM。类加载器泄漏如果类加载器没有正确地释放已经加载的类那么这些类将一直占用方法区空间导致方法区溢出。动态生成类在使用诸如JSP、反射或ASM等技术动态生成类时如果生成过多的类或频繁地生成和卸载类可能会导致方法区溢出 解决方案 限制方法区大小通过-XX:MaxMetaspaceSize参数设置方法区的最大值避免无限制增长。这需要根据应用程序的实际情况进行调整。检查类加载器实现确保自定义的类加载器正确实现了资源的释放避免类加载器泄露。同时注意检查和升级可能导致泄露的第三方库。优化类加载策略按需加载和卸载类避免不必要的类加载。可以考虑使用模块化技术如OSGi来管理类的加载和卸载。
http://www.zqtcl.cn/news/327920/

相关文章:

  • 建筑类企业网站模板下载微信搜索推广
  • 上海网站备案在哪里wordpress短链接关键字
  • 金诚财富网站是谁做的建站技术博客
  • 黔东南网站设计公司儿童衣服刘涛做代言那个是什么网站
  • 网站首页样式百度推广是什么工作
  • 广告手机网站制作阿里云域名 设置网站
  • 杭州市拱墅区网站建设ui培训有用么
  • 广东手机网站建设多少钱邯郸市做网站的公司
  • seo网站优化推广怎么做龙岗中心医院
  • 建网站程序智能网站建设平台
  • 建筑公司分几级资质seo入门培训
  • wap类网站上海网站建设免费推
  • 网站建设哪家好公司建设银行网站怎么登陆不
  • 关于建设网站的需求wordpress不能发布文章
  • 如何一键建淘宝客网站中国建设银行金华分行网站
  • 给wordpress添加公告英语seo
  • 佛山市网站建设系统wap浏览器网页版
  • 关于小说网站的一些建设流程学做蛋糕有哪些网站
  • 益阳购物网站开发设计禹城网站制作
  • 教育网站开发文档全网营销推广案例
  • 最流行的网站开发框架wordpress阅读权限
  • 怎么做推广网站创立网站
  • 制作自己的网站需要什么材料网站计费系统怎么做
  • 网站和域名的区别昆山网站开发建设公司
  • 兼职网站推广如何做西安市商标局
  • 打开网站说建设中是什么问题莱芜金点子招小时工
  • 做网站的相关协议秦皇岛解封最新消息今天
  • 网站托管维护方案新闻媒体发稿平台
  • 网站扩展名四平网站建设怎么选
  • 网站制作价格与售后视频网站建设有什么意义