java.lang.StackOverflowError

demo

栈的深度方法调用导致的堆栈溢出

  1. package com.interview.demo.oom;
  2. /**
  3. * @Author leijs
  4. * @date 2022/3/30
  5. */
  6. public class StackOverflowErrorDemo {
  7. public static void main(String[] args) {
  8. stackOverflowError();
  9. }
  10. private static void stackOverflowError() {
  11. stackOverflowError();
  12. }
  13. }

image.png

堆栈溢出属于Error

image.png
image.png
image.png

java.lang.OutOfMemory: java heap space

demo

内存只调整1M
image.png

  1. import java.util.Random;
  2. /**
  3. * @Author leijs
  4. * @date 2022/3/30
  5. */
  6. public class JavaHeapspaceDemo {
  7. public static void main(String[] args) {
  8. String str = "youzan";
  9. while (true) {
  10. str += new Random().nextInt(111111111) + new Random().nextInt(222222222);
  11. }
  12. }
  13. }

image.png

堆内存溢出属于Error

image.png

java.lang.OutOfMemory: GC overhead limit exceeded

image.png
GC回收过长时会抛出OutOfMemoryError. 过长的定义是,98%的时间用来做GC并且回收了不到2%的堆内存。连续多次GC都只回收了不到2%的极端情况下才会出现。假如不抛出GC overhead limit 错误会发生什么情况呢?那就是GC清理的这么点内存会很快再次填满,迫使GC再次执行,这样就形成了恶性循环。CPU使用率一直是100%,而GC没有任何效果。

demo

image.png

  1. package com.interview.demo.oom;
  2. import com.google.common.collect.Lists;
  3. import java.util.List;
  4. /**
  5. * @Author leijs
  6. * @date 2022/3/30
  7. */
  8. public class GCOverheadDemo {
  9. public static void main(String[] args) {
  10. int i = 0;
  11. List<String> list = Lists.newArrayList();
  12. while (true) {
  13. list.add(String.valueOf(++i).intern());
  14. }
  15. }
  16. }

image.png
image.png
是产生了GC,但是回收效果不明显。

java.lang.OutOfMemory: Direct buffer memory

出现原因:

image.png

demo

image.png

  1. package com.interview.demo.oom;
  2. import sun.misc.VM;
  3. import java.nio.ByteBuffer;
  4. /**
  5. * @Author leijs
  6. * @date 2022/3/30
  7. */
  8. public class DirectBufferMemoryDemo {
  9. public static void main(String[] args) {
  10. System.out.println("配置的maxDirectMemory:" + VM.maxDirectMemory() / 1024 / 2024 + "MB");
  11. // 分配OS本地内存,不属于GC管辖范围
  12. ByteBuffer bb = ByteBuffer.allocateDirect(6 * 1024 * 1024);
  13. }
  14. }

image.png

java.lang.OutOfMemory: unable to create new native thread

导致原因

准确的将native thread异常与对应的平台有关。

  1. 应用创建了太多的线程,超过系统承载极限
  2. 服务器不允许你的应用创建这么多的线程,linux默认允许单个进程可以创建的线程数是1024个;应用创建超过这个数量,就会报错这个

    解决办法

  3. 降低线程创建的数量,分析应用是否需要创建这么多的线程

  4. 确实需要,可以修改linux服务器的限制,扩大linux的默认限制

    demo

    ```java package com.interview.demo.oom;

import java.util.concurrent.TimeUnit;

/**

  • @Author leijs
  • @date 2022/3/30 */ public class UnableCreateNewThreadDemo { public static void main(String[] args) {
    1. for (int i = 0; ; i++) {
    2. System.out.println("==============" + i);
    3. new Thread(() -> {
    4. try {
    5. TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
    6. } catch (InterruptedException e) {
    7. e.printStackTrace();
    8. }
    9. }).start();
    10. }
    } }
  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/999234/1648637093147-40d591d0-8c36-48bd-9fd8-1aa936d16591.png#clientId=ufed7f55d-a401-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=114&id=ud1811874&margin=%5Bobject%20Object%5D&name=image.png&originHeight=128&originWidth=1090&originalType=binary&ratio=1&rotation=0&showTitle=false&size=27112&status=done&style=none&taskId=uee24f46c-65a5-4ae8-b960-bd8148ca1ab&title=&width=968.8888888888889)
  2. <a name="TlAD6"></a>
  3. ### linux调整最大线程数
  4. Root用户:ulimit -u <br />1024
  5. 修改: vim /etc/security/limits.d/90-nproc.conf
  6. <a name="kABQc"></a>
  7. ## java.lang.OutOfMemory: Metaspace
  8. -XX:+PrintFlagsInitial 默认20MB<br />元空间使用的是本地内存,主要存放:
  9. - 虚拟机加载的类信息
  10. - 常量池
  11. - 静态变量
  12. - 即时编译后的代码
  13. <a name="bb5eP"></a>
  14. ### demo
  15. ```java
  16. package com.interview.demo.oom;
  17. import net.sf.cglib.proxy.Enhancer;
  18. import net.sf.cglib.proxy.MethodInterceptor;
  19. import net.sf.cglib.proxy.MethodProxy;
  20. import java.lang.reflect.Method;
  21. /**
  22. * @Author leijs
  23. * @date 2022/3/30
  24. */
  25. public class MetaspaceOOMDemo {
  26. public static void main(String[] args) {
  27. // 计数多少次发生异常
  28. int i = 0;
  29. try {
  30. while (true) {
  31. i++;
  32. Enhancer enhancer = new Enhancer();
  33. enhancer.setSuperclass(OOMTest.class);
  34. enhancer.setUseCache(false);
  35. enhancer.setCallback(new MethodInterceptor() {
  36. @Override
  37. public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  38. return methodProxy.invokeSuper(o, args);
  39. }
  40. });
  41. enhancer.create();
  42. }
  43. } catch (Exception e) {
  44. System.out.println("多少次异常:" + i);
  45. throw e;
  46. }
  47. }
  48. static class OOMTest {
  49. }
  50. }

image.png
image.png