首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java常见问题分析(内存溢出内存泄露、线程阻塞等)

常见内存问题 2.3 ML(内存泄露) OOM(内存溢出)问题现象及分析 2.4 IBM DUMP分析工具使用介绍 Java应用CPU、线程问题分析 Java垃圾回收机制(GC) 1.GC机制作用 1.1...3.内存溢出类型: 虚拟机栈溢出、本地方法栈溢出、方法区溢出、堆溢出、运行时常量池溢出 异常类型: (1) java.lang.OutOfMemoryError: Java heap space 堆内存溢出...线程dump分析 活跃线程 阻塞线程 等待资源线程 ?...thread struck在了i/o、db等 实例: IO阻塞(程序表现为响应慢) 线程状态为“in Object.wait()”,说明正在等待线程池可用资源,由于线程导致新的IO请求处于排队等待状态...3.程序无响应 死锁(程序表现为无响应) 线程状态为“waiting to lock”: 两个线程各持有一个锁,又在等待另一个锁,故造成死锁,且发生在DeadLockTest.java:39行 ?

1.3K10

由多线程内存溢出产生的实战分析

同时我们不能因为报错暂停服务使用,而影响商户,所以决定要先解决问题,于是采用必杀技重启这台服务器,观察一小时内存溢出消失,问题暂时解决。...第二天白天这个问题并没有复现,我认为这是偶发事件,就没有过于在意,于是当晚再次出现内存溢出,并且还是随机某一台服务器爆出,我紧急找到监控部和系统部要求拿到栈信息内容和dump文件,然而并没有。。。。...多线程内存溢出的理论支撑 通过上面的分析,我们看到其实多线程内存溢出有很大原因是因为系统设置和内存大小造成的,那么我们如何来分析当前系统配置能够支持多少线程呢?...文章开始的时候说过,在内存溢出的时候,因为服务器重启导致jstack内容消失了,虽然配置了jvm参数HeapDumpOnOutOfMemoryError,但并没有产生相应的dump文件,于是我们采用脚本导出的方式...要是服务器内存比较大,就需要通过调整jvm参数来增加线程使用的内存,比如减小-Xss值,这个值越小能创建的线程数也就越多,也可以适当减少-Xmx和-Xms的值,增加堆外内存的容量。

1K50
您找到你想要的搜索结果了吗?
是的
没有找到

还在用Executors创建线程池?小心内存溢出

线程池不建议使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。...Executors各个方法的弊端: newFixedThreadPool 和 newSingleThreadExecutor: 主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。...,可能会创建数量非常多的线程,甚至OOM。..., // 线程池的最大线程数 long keepAliveTime, // 当线程数大于核心时,多余的空闲线程等待新任务的存活时间。...SynchronousQueue: 一个不存储元素的阻塞队列,消费者线程调用take()方法的时候就会发生阻塞,直到有一个生产者线程生产了一个元素,消费者线程就可以拿到这个元素并返回;生产者线程调用put

1.5K40

由多线程内存溢出产生的实战分析

同时我们不能因为报错暂停服务使用,而影响商户,所以决定要先解决问题,于是采用必杀技重启这台服务器,观察一小时内存溢出消失,问题暂时解决。...第二天白天这个问题并没有复现,我认为这是偶发事件,就没有过于在意,于是当晚再次出现内存溢出,并且还是随机某一台服务器爆出,我紧急找到监控部和系统部要求拿到栈信息内容和dump文件,然而并没有。。。。...四、多线程内存溢出的理论支撑 通过上面的分析,我们看到其实多线程内存溢出有很大原因是因为系统设置和内存大小造成的,那么我们如何来分析当前系统配置能够支持多少线程呢?...文章开始的时候说过,在内存溢出的时候,因为服务器重启导致jstack内容消失了,虽然配置了jvm参数HeapDumpOnOutOfMemoryError,但并没有产生相应的dump文件,于是我们采用脚本导出的方式...要是服务器内存比较大,就需要通过调整jvm参数来增加线程使用的内存,比如减小-Xss值,这个值越小能创建的线程数也就越多,也可以适当减少-Xmx和-Xms的值,增加堆外内存的容量。

1.1K60

jvm堆内存溢出后,其他线程是否可继续工作

由于题目中给出的OOM,java中OOM又分很多类型;比如:堆溢出(“java.lang.OutOfMemoryError: Java heap space”)、永久带溢出(“java.lang.OutOfMemoryError...本文主要是分析堆溢出对应用带来的影响。 直接实验验证 ---- ? 日志输入: ? ? ? ? 从日志可以看出在thead-0发生OOM之后,thread-1仍旧能够继续申请内存工作。...使用jconsole监控发现,thread-0开始慢慢把heap压,发生OOM之后神奇的事情发生了,heap基本上被清空了,通过查看jconsole看到的线程信息,发现没有thead-0线程了。...再比如MyThread0中一次性申请的内存太大,比如超过heap大小;其他申请小内存线程肯定不会受到影响。 总结 ---- 发生OOM之后会不会影响其他线程正常工作需要具体的场景分析。...但是就一般情况下,发生OOM的线程都会终结(除非代码写的太烂),该线程持有的对象占用的heap都会被gc了,释放内存

99610

JVM 堆内存溢出后,其他线程是否可继续工作?

这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。...本文主要是分析堆溢出对应用带来的影响。 先说一下答案,答案是还能运行。...这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行! 讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。...注意了,这个例子我只演示了堆溢出的情况。如果是栈溢出,结论也是一样的,大家可自行通过代码测试。...总结:其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存

54810

jvm堆内存溢出后,其他线程是否可继续工作

由于题目中给出的OOM,java中OOM又分很多类型;比如:堆溢出(“java.lang.OutOfMemoryError: Java heap space”)、永久带溢出(“java.lang.OutOfMemoryError...本文主要是分析堆溢出对应用带来的影响。 直接实验验证 日志输入: 从日志可以看出在thead-0发生OOM之后,thread-1仍旧能够继续申请内存工作。...使用jconsole监控发现,thread-0开始慢慢把heap压,发生OOM之后神奇的事情发生了,heap基本上被清空了,通过查看jconsole看到的线程信息,发现没有thead-0线程了。...再比如MyThread0中一次性申请的内存太大,比如超过heap大小;其他申请小内存线程肯定不会受到影响。 总结 发生OOM之后会不会影响其他线程正常工作需要具体的场景分析。...但是就一般情况下,发生OOM的线程都会终结(除非代码写的太烂),该线程持有的对象占用的heap都会被gc了,释放内存

94330

面试官:ThreadLocal 搭配线程池时为什么会造成内存泄漏?

ThreadLocal是什么 ThreadLocal是一个本地线程副本变量工具类。...主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。...Map里面存储线程本地对象(key)和线程的变量副本(value) 但是,Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。...所以对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰。...当线程没有结束,但是ThreadLocal已经被回收,则可能导致线程中存在ThreadLocalMap的键值对,造成内存泄露。

42910

用@Async会内存溢出?看看你的线程池配置了没!

但当接口被客户端频繁调用的时候,异步任务的数量就会大量增长:3 x n(n为请求数量),如果任务处理不够快,就很可能会出现内存溢出的情况。那么为什么会内存溢出呢?...maxSize:允许的最大线程数,默认为INT的最大值(2的31次方-1)。 所以,默认情况下,一般任务队列就可能把内存给堆满了。...所以,我们真正使用的时候,还需要对异步任务的执行线程池做一些基础配置,以防止出现内存溢出导致服务不可用的问题。...,任务三进入队列等待 任务一完成,释放出一个核心线程,任务三从队列中移出,并占用核心线程开始处理 注意:这里可能有的小伙伴会问,最大线程不是5么,为什么任务三是进缓冲队列,不是创建新线程来处理吗?...这里要理解缓冲队列与最大线程间的关系:只有在缓冲队列满了之后才会申请超过核心线程数的线程来进行处理。所以,这里只有缓冲队列中10个任务满了,再来第11个任务的时候,才会在线程池中创建第三个线程来处理。

79320

美团面试:JVM 堆内存溢出后,其他线程是否可继续工作?

最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?” 我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。...本文主要是分析堆溢出对应用带来的影响。 先说一下答案,答案是还能运行。...这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行! 讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。...注意了,这个例子我只演示了堆溢出的情况。如果是栈溢出,结论也是一样的,大家可自行通过代码测试。...总结:其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存

44740

某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。...本文主要是分析堆溢出对应用带来的影响。 先说一下答案,答案是还能运行。...这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行! 讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。...注意了,这个例子我只演示了堆溢出的情况。如果是栈溢出,结论也是一样的,大家可自行通过代码测试。...总结:其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存

43910

某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”。 我看网上出现了很多不靠谱的答案。 这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。...本文主要是分析堆溢出对应用带来的影响。 先说一下答案,答案是还能运行 。...这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行! 讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。...注意了,这个例子我只演示了堆溢出的情况。如果是栈溢出,结论也是一样的,大家可自行通过代码测试。...总结:其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存

29010

某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。...本文主要是分析堆溢出对应用带来的影响。 先说一下答案,答案是还能运行。...这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行! 讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。...注意了,这个例子我只演示了堆溢出的情况。如果是栈溢出,结论也是一样的,大家可自行通过代码测试。...总结:其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存

48530

某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。...本文主要是分析堆溢出对应用带来的影响。 先说一下答案,答案是还能运行。...这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行! 讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。...注意了,这个例子我只演示了堆溢出的情况。如果是栈溢出,结论也是一样的,大家可自行通过代码测试。...总结:其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存

33430

某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。...本文主要是分析堆溢出对应用带来的影响。 先说一下答案,答案是还能运行。...这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行! 讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。...注意了,这个例子我只演示了堆溢出的情况。如果是栈溢出,结论也是一样的,大家可自行通过代码测试。...总结:其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存

32420

美团面试题:JVM堆内存溢出后,其他线程是否可继续工作?

这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。...本文主要是分析堆溢出对应用带来的影响。 先说一下答案,答案是还能运行。...这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行! 讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。...注意了,这个例子我只演示了堆溢出的情况。如果是栈溢出,结论也是一样的,大家可自行通过代码测试。...总结 其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存

54130

Java多线程编程-(11)-面试常客ThreadLocal出现OOM内存溢出的场景和原理分析

2、设置JVM参数设置最大内存为256M,以便模拟出OOM: ? 3、运行代码,输出结果: ? 可以看出,单线程池执行到第212的时候,就报了错误,出现OOM内存溢出错误。...5、这个实例可以很好的演示了:线程池的一个线程使用完ThreadLocal对象之后,再也不用,由于线程池中的线程不会退出,线程池中的线程的存在,同时ThreadLocal变量也会存在,占用内存!...造成OOM溢出!...二、ThreadLocal为什么会内存泄漏 在上一篇的时候,已经简单的介绍了不正当的使用ThreadLocal造成OOM的原因,下边详细的介绍一下: 1、首先看一下ThreadLocal的原理图: 在ThreadLocal...,这些key为null的Entry的value就会一直存在一条强引用链:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永远无法回收,造成内存泄漏

1.1K20

Java多线程编程-(20)-借ThreadLocal出现OOM内存溢出问题再谈弱引用WeakReference

一、简单回顾 在上几篇的时候,已经简单的介绍了不正当的使用ThreadLocal造成OOM的原因,以及ThreadLocal的基本原理,下边我们首先回顾一下ThreadLocal的原理图以及各类之间的关系...ThreadLocal到Entry对象key的引用断裂,而不及时的清理Entry对象,可能会造成OOM内存溢出!...,GC收集器也绝不会回收该对象,如果内存空间不够就会导致内存溢出。...对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行回收,以免出现内存溢出。如果这次回收还是没有足够的内存,才会抛出内存溢出异常。...这也说明了正常情况下使用ThreadLocal是不会出现OOM内存溢出的,出现内存溢出是和弱引用没有半点关系的!

72720

深入理解JVM(六)——JVM性能调优实战

但当再次发生内存溢出时,没有生成相关异常日志。从而可以判定,不是堆内存发生溢出。...直接内存的垃圾回收过程 直接内存虽然不是JVM内存空间,但它的垃圾回收也有JVM负责。直接内存的垃圾回收发生在Full GC时,只有当老年代内存时,垃圾收集器才会顺便收集一下直接内存中的垃圾。...异步通信就是当客户端向服务器发送一个HTTP请求后,将这个请求的TCP连接委托给其它线程,然后它转而做别的事,那条被委托的线程保持TCP连接,等待服务器的回信。...当收到服务器回信后,再将收到的数据转交给刚才的线程。这个过程就是异步通信过程。 异步请求如何造成JVM崩溃?...如果一个Web应用使用了较多的异步请求(AJAX),每次主线程发送完请求后都将TCP连接交给一条新的线程去等待服务器回信,那么如果网络不流畅时,这些受委托的线程迟迟等不到服务器的回信,因此保持着TCP连接

1.4K60

2020-10-10:OOM都有哪些,说出几种?

当运行时程序请求的虚拟内存溢出时就会报 Outof swap space 错误。...2.Unable to create new native thread:每个 Java 线程都需要占用一定的内存空间,当 JVM 向底层操作系统请求创建一个新的 native 线程时,如果没有足够的资源分配就会报此类错误...虚拟机栈: 1.java.lang.StackOverflowError :栈内存溢出,可能会被部分面试官怼,说这个不是OOM,得注意。...3.GC overhead limit exceeded (GC回收时间过长,且超过98%的时间都在做垃圾回收且回收的堆内存只占2%造成程序的恶性循环,便会抛出该错误。)...3.PermGen space:该错误表示永久代(Permanent Generation)已用,通常是因为加载的 class 数目太多或体积太大。

40543
领券