个人小型网站建设怎样注册公司流程
2026/6/9 23:39:44 网站建设 项目流程
个人小型网站建设,怎样注册公司流程,容桂免费网站建设公司,it人力外包实战#xff1a;OutOfMemoryError异常 除了程序计数器外#xff0c;堆、虚拟机栈、元空间、直接内存都有发生OOM的可能 下面我们演示下引起各区域OOM的情况#xff0c;及观察下其异常表现#xff0c;进而初步总结各异常时的调优策略 JVM调优实例#xff1a; 堆#xff1a…实战OutOfMemoryError异常除了程序计数器外堆、虚拟机栈、元空间、直接内存都有发生OOM的可能下面我们演示下引起各区域OOM的情况及观察下其异常表现进而初步总结各异常时的调优策略JVM调优实例堆-》OOM: Java heap space -获取堆转储快照-》分析是溢出调大堆还是泄漏优化代码并解决虚拟机栈-》SOF -》根据堆栈信息去解决-》OOM - 线程过多 -》调小堆给虚拟机栈留出内存元空间 -》OOM:Metaspace -调整代码调大元空间上限直接内存 -》OOM,但堆转储文件很小且没异常-》调大直接内存Java堆溢出java堆异常一般是由于创建了太多的无法回收的对象导致超过了堆的最大容量的。异常处理思路所以异常处理时的思路是1、先拿到异常的堆转储快照。2、然后根据快照判断溢出对象是否必要。如必要则是内存溢出看看能不能调大内存或者调小一些不必要的对象的生命周期腾出一部分空间。如不必要则是内存泄漏通过GC ROOT查看对象的引用链看看为啥没有回收并加以解决。模拟异常Java堆OOM是常见情况异常信息中会进一步提示Java heap space。模拟代码/** * VM Args-Xms20m -Xmx20m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPathD:\IdeaSpeace\jvm * 限制Java堆的大小为20MB不可扩展将堆的最大最小值-Xmx-Xms参数设置一样,出现内存溢出异常的时候Dump出当前的内存堆转储快照制定存储路径 */publicclassHeapOOM{staticclassOOMObject{}publicstaticvoidmain(String[]args){ListOOMObjectlistnewArrayListOOMObject();while(true){list.add(newOOMObject());}}}运行结果java.lang.OutOfMemoryError: Java heap space Dumping heap to D:\IdeaSpeace\jvm\java_pid8584.hprof ... Heap dump file created [27646160 bytes in 0.090 secs]详细操作步骤1、通过-XX:HeapDumpOnOutOfMemoryError拿到堆转储快照。2、通过jprofiler工具分析堆转储快照判断内存中导致OOM的对象是否必要2.1、不必要 - 内存泄漏- 查看对象GC ROOT引用链进而定位为何无法回收最终找到泄漏位置加以解决2.2、必要 - 内存溢出- 调整堆大小、修改不合理代码。2.2.1、调整堆大小在机器内存允许的范围内适当调整java虚拟机(-Xmx与-Xms)堆参数2.2.2、修改不合理代码检查代码中是否存在长生命周期的对象不合理的存储结构设计比如可以用long但是用map存虚拟机栈和本地方法栈溢出1、栈深度过深栈深度 虚拟机的最大深度 -》StackOverflowError异常。注意HotSpot虚拟机中不区分虚拟机栈和本地方法栈所以栈容量只由-Xss设定-Xoss参数设置本地方法栈大小不发挥作用2、创建线程数过多 -》OOM异常。(创建线程数 * 线程栈内存) (进程内存操作系统限制- 最大堆容量 - 最大方法区容量)异常处理思路1、StackOverflowError异常根据打印出的堆栈信息去定位即可。在使用默认-Xss参数的情况下一般而言到达1000~2000的栈深度是完全没有问题的。具体深度由压入的栈帧大小决定2、OOM异常此时会提示unable to create native thread表示线程数过多2.1、线程数异常创建 -》 优化代码减少不必要的线程创建2.2、创建的线程均必须 -》 减少最大堆、减少栈容量来提升创建线程数。线程数过多引发OOM时需反向调整堆大小来给创建线程分配虚拟机栈提供更多可用内存。异常代码演示1、栈深度过深引发SOF异常/** * VM Args-Xss128k (使用-Xss参数减少栈内存容量) */publicclassJavaVMStackSOF{privateintstackLength1;publicvoidstackLeak(){stackLength;stackLeak();}publicstaticvoidmain(String[]args)throwsThrowable{JavaVMStackSOFoomnewJavaVMStackSOF();try{oom.stackLeak();}catch(Throwablee){System.out.println(stack length:oom.stackLength);throwe;}}}运行结果stack length:2298 Exception in thread main java.lang.StackOverflowError at com.dream.my.faceTest.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:11) at com.dream.my.faceTest.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12) at com.dream.my.faceTest.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12) ……后续异常堆栈信息省略2、创建线程数过多耗尽内存引发 OOM异常重点提示: 如果运行上面这段代码记得要先保存当前的工作。 因为在Windows平台的Java的线程是映射到操作系统的内核线程上创建过多线程可能导致操作系统假死。/** * VM Args-Xss2M 这时候不妨设大些请在32位系统下运行 */publicclassJavaVMStackOOM{privatevoiddontStop(){while(true){}}publicvoidstackLeakByThread(){while(true){ThreadthreadnewThread(newRunnable(){Overridepublicvoidrun(){dontStop();}});thread.start();}}publicstaticvoidmain(String[]args)throwsThrowable{JavaVMStackOOMoomnewJavaVMStackOOM();oom.stackLeakByThread();}}异常关键信息unable to create new native threadException in thread main java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:717) at com.dream.my.faceTest.jvm.JavaVMStackOOM.stackLeakByThread(JavaVMStackOOM.java:22) at com.dream.my.faceTest.jvm.JavaVMStackOOM.main(JavaVMStackOOM.java:28)元空间溢出背景从jdk7起方法区就被放在堆中常见问题使用aop动态生成大量字节码cglib导致OOM异常排查思路1、定位到java.lang.OutOfMemoryError: Metaspace即是方法区溢出。2、确定是否使用了不必要的aop3、如果类都是必要的调大元空间的值-XX:MaxMetaspaceSize# 元空间调优参数 -XX:MaxMetaspaceSize //设置元空间最大值推荐256M~512M超过后报OOM-1 为不限制大小 -XX:MetaspaceSize //达到该值后元空间进行第一次GCGC后如仍超过则扩容未原来的1.2倍 -XX:MinMetaspaceFreeRatio //GC后元空间最小空闲空间比率不够则扩容 -XX:MaxMetaspaceFreeRatio //GC后元空间最大空闲空间比率多了则缩容异常演示代码(JDK8)方法区的主要职责是用于存放类型的相关信息如类名、访问修饰符、常量池、字段描述、方法描述等。对于这部分区域的测试基本的思路是运行时产生大量的类去填满方法区直到溢出为止。/** * VM Args-XXMetaspaceSize10M -XXMaxMetaspaceSize10M * 借助CGLib使得方法区出现内存溢出异常 */publicclassJavaMethodAreaOOM{publicstaticvoidmain(String[]args){while(true){EnhancerenhancernewEnhancer();enhancer.setSuperclass(OOMObject.class);enhancer.setUseCache(false);enhancer.setCallback(newMethodInterceptor(){publicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{returnproxy.invokeSuper(obj,args);}});enhancer.create();}}staticclassOOMObject{}}运行结果Caused by: java.lang.OutOfMemoryError: Metaspace at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:554) ... 7 more本机直接内存溢出直接内存不在jvm内存模型内但也是有可能导致OOM.典型的间接使用就是NIO异常定位排查思路1、出现了OOM异常但是Heap Dump文件很小且期中没什么异常信息此时就该考虑是不是直接内存溢出了。2、调整直接内存大小-XXMaxDirectMemorySize 指定直接内存大小默认与Java堆最大值一致异常演示代码/** * VM Args-Xmx20M -XX:MaxDirectMemorySize10M */publicclassDirectMemoryOOM{privatestaticfinalint_1MB1024*1024;publicstaticvoidmain(String[]args)throwsException{FieldunsafeFieldUnsafe.class.getDeclaredFields()[0];unsafeField.setAccessible(true);//分配本机内存Unsafeunsafe(Unsafe)unsafeField.get(null);while(true){//真正申请分配内存unsafe.allocateMemory(_1MB);}}}运行结果Exception in thread main java.lang.OutOfMemoryError at sun.misc.Unsafe.allocateMemory(Native Method) at com.dream.my.faceTest.jvm.DirectMemoryOOM.main(DirectMemoryOOM.java:23)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询