多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁
8852023-08-21
各位老铁们,大家好,今天由我来为大家分享java线程死锁和内存溢出,该怎么解决,以及线程池内存溢出解决办法的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
本文目录
java线程死锁或者线程数过高的:
1、获取java的进程ID
ps-ef|grepjava
2、导出线程堆栈(其中32494换为上一个步骤查询到的进程ID)
jstack-l32494>>/usr/local/Client/log20180116.log
3、将上一个步骤生成导出.log文件拷贝到本机,然后用记事本打开,检查哪个线程有大量的重复,之后再结合业务进行排除。(比如如果60%都是其中某个类的某个方法引起的堆栈,则很有可能是这个方法阻塞了)
把FreeOnTerminate去掉,原因是你设置了线程的FreeOnTerminate,这样会导致线程执行完毕的时候,自动释放线程对象,这样就导致了这个线程对象是在主线程中申请的,但是在分线程释放的,一般解决办法是线程执行完毕手动释放。
在编写线程的时候,要遵守基本的原则,即本线程申请的内存,本线程负责释放,主线程申请的TThread,应该在主线程释放,而不是用FreeOnTerminate来释放。
栈溢出有两种,一种是stackoverflow,另一种是outofmemory,前者一般是因为方法递归没终止条件,后者一般是方法中线程启动过多。
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
可以使用相应的软件测试工具对软件进行检测。
1.ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。
2.Dmalloc-DebugMallocLibrary.
3.Electric
Fence-Linux分发版中由BrucePerens编写的malloc()调试库。
4.Leaky-Linux下检测内存泄漏的程序。
5.LeakTracer-Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。
6.MEMWATCH-由Johan
Lindh编写,是一个开放源代码C语言内存错误检测工具,主要是通过gcc的precessor来进行。
7.Valgrind-DebuggingandprofilingLinuxprograms,aimingat
programswritteninCandC++.
8.KCachegrind-Avisualizationtoolfortheprofilingdata
generatedbyCachegrindandCalltree.
9.Leak
Monitor-一个Firefox扩展,能找出跟Firefox相关的泄漏类型。
10.IELeakDetector
(Drip/IESieve)-Drip和IESieveleak
detectors帮助网页开发员提升动态网页性能通过报告可避免的因为IE局限的内存泄漏。
11.WindowsLeaks
Detector-探测任何Win32应用程序中的任何资源泄漏(内存,句柄等),基于WinAPI调用钩子。
12.SAPMemory
Analyzer-是一款开源的JAVA内存分析软件,可用于辅助查找JAVA程序的内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse
RCP(RichClientPlatform),可以下载RCP的独立版本或者Eclipse的插件。
13.DTrace-即动态跟踪Dynamic
Tracing,是一款开源软件,能在Unix类似平台运行,用户能够动态检测操作系统内核和用户进程,以更精确地掌握系统的资源使用状况,提高系统性能,减少支持成本,并进行有效的调节。
14.IBMRationalPurifyPlus-帮助开发人员查明C/C++、托管.NET、Java和VB6代码中的性能和可靠性错误。PurifyPlus
将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。
15.ParasoftInsure++-针对C/C++应用的运行时错误自动检测工具,它能够自动监测C/C++程序,发现其中存在着的内存破坏、内存泄漏、指针错误和I/O等错误。并通过使用一系列独特的技术(SCI技术和变异测试等),彻底的检查和测试我们的代码,精确定位错误的准确位置并给出详细的诊断信息。能作为Microsoft
VisualC++的一个插件运行。
16.CompuwareDevPartnerforVisualC++BoundsChecker
Suite-为C++开发者设计的运行错误检测和调试工具软件。作为MicrosoftVisualStudio和C++6.0的一个插件运行。
17.ElectricSoftwareGlowCode-包括内存泄漏检查,code
profiler,函数调用跟踪等功能。给C++和.Net开发者提供完整的错误诊断,和运行时性能分析工具包。
18.CompuwareDevPartnerJava
Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块。
19.QuestJProbe-分析Java的内存泄漏。
20.ej-technologiesJProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。4.3.2注册码:A-G666#76114F-1olm9mv1i5uuly#0126
21.BEAJRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。
22.SciTechSoftwareAB.NETMemory
Profiler-找到内存泄漏并优化内存使用针对C#,VB.Net,或其它.Net程序。
23.YourKit.NET&JavaProfiler-业界领先的Java和.NET程序性能分析工具。
24.AutomatedQAAQTime-AutomatedQA的获奖产品performanceprofiling和memory
debugging工具集的下一代替换产品,支持Microsoft,Borland,Intel,Compaq和
GNU编译器。可以为.NET和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net
1.0,1.1,2.0,3.0和Windows32/64位应用程序。
25.JavaScriptMemoryLeakDetector-微软全球产品开发欧洲团队(GlobalProduct
Development-Europeteam,GPDE)
发布的一款调试工具,用来探测JavaScript代码中的内存泄漏,运行为IE系列的一个插件。
关于java线程死锁和内存溢出,该怎么解决到此分享完毕,希望能帮助到您。