织梦做的网站织梦修改网页,网络营销渠道的组成要素包括,怎样推广小程序平台,科技因子网站建设方案问题来源
一次生产事故#xff0c;由于一次性从数据库查询过多数据导致线程 OOM#xff1a;Java heap space 异常#xff08;千万级表#xff0c;JVM堆内存2G#xff09;#xff0c;但是在线程OOM发生时#xff0c;java进程却没有立即挂掉。
##OOM与异常 说到底OutOfM…问题来源
一次生产事故由于一次性从数据库查询过多数据导致线程 OOMJava heap space 异常千万级表JVM堆内存2G但是在线程OOM发生时java进程却没有立即挂掉。
##OOM与异常 说到底OutOfMemoryError也只是一个java中的异常而已属于Error一系非检查异常
ObjectThrowableErrorVirtualMachineErrorOutOfMemoryError堆内存不够与异常的关系
线程发生OOM Java heap space首先是堆空间不够了然后再由jvm在申请分配空间的方法调用上抛出OOM异常。 对于线程它会像处理普通异常一样处理OutOfMemoryError。
实例
package org.example;import com.sun.javafx.scene.control.skin.TableHeaderRow;import java.util.ArrayList;//TIP To bRun/b code, press shortcut actionIdRun/ or
// click the icon srcAllIcons.Actions.Execute/ icon in the gutter.
public class Main {public static void main(String[] args) throws InterruptedException{//TIP Press shortcut actionIdShowIntentionActions/ with your caret at the highlighted text// to see how IntelliJ IDEA suggests fixing it.System.out.printf(Hello and welcome!);System.out.println(JVM从OS获取的 最大 内存 Runtime.getRuntime().maxMemory() / 1024 / 1024 M);System.out.println(JVM从OS获取的 当前 内存 Runtime.getRuntime().totalMemory() / 1024 / 1024 M);System.out.println(JVM从OS获取的 但空闲 内存 Runtime.getRuntime().freeMemory() / 1024 / 1024 M);// 创建线程new Thread(() - {ArrayListbyte[] bytes new ArrayList();for (int i 0; i 2000; i) {byte[] bytes1 new byte[3 * 1024 * 1024];bytes.add(bytes1);System.out.println(Thread.currentThread().getName():JVM从OS获取的 当前 内存 Runtime.getRuntime().totalMemory() / 1024 / 1024 M);}}).start();// 创建线程new Thread(() - {ArrayListbyte[] bytes new ArrayList();for (int i 0; i 2000; i) {byte[] bytes1 new byte[3 * 1024 * 1024];bytes.add(bytes1);System.out.println(Thread.currentThread().getName():JVM从OS获取的 当前 内存 Runtime.getRuntime().totalMemory() / 1024 / 1024 M);}}).start();while (true){System.out.println(Thread.currentThread().getName() continuing...);Thread.sleep(1000L);}}
}结果
##本机64位16G内存默认最大堆3600M
JVM从OS获取的 最大 内存3600M
JVM从OS获取的 当前 内存243M
JVM从OS获取的 但空闲 内存237M
main continuing...##2个线程分别开始创建byte数组占用内存
Thread-0:JVM从OS获取的 当前 内存307M
Thread-1:JVM从OS获取的 当前 内存307M
Thread-1:JVM从OS获取的 当前 内存307M
Thread-0:JVM从OS获取的 当前 内存307M##JVM增长到极限Thread-1先报OOM
Thread-0:JVM从OS获取的 当前 内存3366M
Thread-0:JVM从OS获取的 当前 内存3366M
Exception in thread Thread-1 java.lang.OutOfMemoryError: Java heap spaceat org.example.Main.lambda$main$1(Main.java:39)at org.example.Main$$Lambda$2/1828972342.run(Unknown Source)at java.lang.Thread.run(Thread.java:750)
Thread-0:JVM从OS获取的 当前 内存3366M
Thread-0:JVM从OS获取的 当前 内存3366M#Thread-1失败终止后起引用的对象也就可以GC了Thread-0又获取了好多内存直到OOM
Thread-0:JVM从OS获取的 当前 内存3616M
Thread-0:JVM从OS获取的 当前 内存3616M
Exception in thread Thread-0 java.lang.OutOfMemoryError: Java heap spaceat org.example.Main.lambda$main$0(Main.java:29)at org.example.Main$$Lambda$1/1989780873.run(Unknown Source)at java.lang.Thread.run(Thread.java:750)
main continuing...
main continuing...
main continuing...结论
1、OOM是在线程上发生的会被当做一般异常处理不会导致JVM的退出 2、多线程公用JVM一个线程终止GC后内存重新给其他线程分配。