java内存分析工具
1. 服务器java虚拟机运行内存分析
总体来说也是正常的,内存总是有一个使用,回收而形成的波峰,波谷。而关于code cache这块,jvm现在是使用时加载,故而初始应用启用时会有一个较大的增长,随后会较平稳。
另外你当前项目内存使用比较小,随便使用-Xms 100m -Xmx100m调大到100M就可以解决大部分的问题。
如果你是想知道jconsole的各项说明要参考oracle的官方说明,那一个是比较清楚的。
如果你想知道的是如何分析内存使用,那就建议搜索下java gc log这个选项,使用HP jmeter这样的专业工具分析gc日志。
2. 常见的java堆存储文件分析工具有哪些及其特点
使用Windows操作系统的人有时会遇到这样的错误信息:“0X?指令引用的0x本文就来简单分析这种错误的常见原因。 一、应用程序没有检查内存分配失败
3. 怎么查看java代码是否内存泄露
第一阶段 通过jdk的GC输出进行测试
可以在 JAVA_OPTS增加以下参数打开jdk的GC输出日志:
-verbose:gc -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
打开输出日志,jdk会在每一次的垃圾回收时打印相关日志
第二阶段 通过jmap命令
jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等
第三阶段 通过Eclipse Memory Analyzer 分析工具来分析
Eclipse Memory Analyzer是一种快速的,功能丰富的Java堆分析工具,以下简称MAT,可以帮助查找内存泄露,并减少内存消耗。 这个工具可以对由堆转储产生的数以亿计的对象进行分析,一旦堆转储被解析,可以在打开他的一瞬间,立即得到保留大小的单一对象,提取记录详细的信息,查看为什么这些对象对象资料没有被释放掉。使用这些功能的报告,可以对这些对象进行跟踪,找到内存泄露嫌疑人,也可以得到系统的性能指数,帮助优化系统。
4. 关于Java的内存占用,有什么详细的分析方法或工具
可以查看gc日志发现程序内存问题。
5. 怎样查看JAVA内存的大小
首先先说一下JVM内存结构问题,JVM为两块:PermanentSapce和HeapSpace,其中
Heap = }。PermantSpace负责保存反射对象,一般不用配置。JVM的Heap区可以通过-X参数来设定。
当一个URL被访问时,内存申请过程如下:
A. JVM会试图为相关Java对象在Eden中初始化一块内存区域
B. 当Eden空间足够时,内存申请结束。否则到下一步
C. JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收), 释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区
D. Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区
E. 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级)
F. 完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”
JVM调优建议:
ms/mx:定义YOUNG+OLD段的总尺寸,ms为JVM启动时YOUNG+OLD的内存大小;mx为最大可占用的YOUNG+OLD内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
NewSize/MaxNewSize:定义YOUNG段的尺寸,NewSize为JVM启动时YOUNG的内存大小;MaxNewSize为最大可占用的YOUNG内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
PermSize/MaxPermSize:定义Perm段的尺寸,PermSize为JVM启动时Perm的内存大小;MaxPermSize为最大可占用的Perm内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
SurvivorRatio:设置Survivor空间和Eden空间的比例
内存溢出的可能性
1. OLD段溢出
这种内存溢出是最常见的情况之一,产生的原因可能是:
1) 设置的内存参数过小(ms/mx, NewSize/MaxNewSize)
2) 程序问题
单个程序持续进行消耗内存的处理,如循环几千次的字符串处理,对字符串处理应建议使用StringBuffer。此时不会报内存溢出错,却会使系统持续垃圾收集,无法处理其它请求,相关问题程序可通过Thread Dump获取(见系统问题诊断一章)单个程序所申请内存过大,有的程序会申请几十乃至几百兆内存,此时JVM也会因无法申请到资源而出现内存溢出,对此首先要找到相关功能,然后交予程序员修改,要找到相关程序,必须在Apache日志中寻找。
当Java对象使用完毕后,其所引用的对象却没有销毁,使得JVM认为他还是活跃的对象而不进行回收,这样累计占用了大量内存而无法释放。由于目前市面上还没有对系统影响小的内存分析工具,故此时只能和程序员一起定位。
2. Perm段溢出
通常由于Perm段装载了大量的Servlet类而导致溢出,目前的解决办法:
1) 将PermSize扩大,一般256M能够满足要求
2) 若别无选择,则只能将servlet的路径加到CLASSPATH中,但一般不建议这么处理
3. C Heap溢出
系统对C Heap没有限制,故C Heap发生问题时,Java进程所占内存会持续增长,直到占用所有可用系统内存
参数说明:
JVM 堆内存(heap)设置选项
参数格式
说 明
设置新对象生产堆内存(Setting the Newgeneration heap size)
-XX:NewSize
通过这个选项可以设置Java新对象生产堆内存。在通常情况下这个选项的数值为1 024的整数倍并且大于1MB。这个值的取值规则为,一般情况下这个值-XX:NewSize是最大堆内存(maximum heap size)的四分之一。增加这个选项值的大小是为了增大较大数量的短生命周期对象
增加Java新对象生产堆内存相当于增加了处理器的数目。并且可以并行地分配内存,但是请注意内存的垃圾回收却是不可以并行处理的
设置最大新对象生产堆内存(Setting the maximum New generation heap size)
-XX:MaxNewSize
通过这个选项可以设置最大Java新对象生产堆内存。通常情况下这个选项的数值为1 024的整数倍并且大于1MB
其功用与上面的设置新对象生产堆内存-XX:NewSize相同
设置新对象生产堆内存的比例(Setting New heap size ratios)
-XX:SurvivorRatio
新对象生产区域通常情况下被分为3个子区域:伊甸园,与两个残存对象空间,这两个空间的大小是相同的。通过用-XX:SurvivorRatio=X选项配置伊甸园与残存对象空间(Eden/survivor)的大小的比例。你可以试着将这个值设置为8,然后监控、观察垃圾回收的工作情况
设置堆内存池的最大值(Setting maximum heap size)
-Xmx
通过这个选项可以要求系统为堆内存池分配内存空间的最大值。通常情况下这个选项的数值为1 024的整数倍并且大于1 MB
一般情况下这个值(-Xmx)与最小堆内存(minimum heap size –Xms)相同,以降低垃圾回收的频度
取消垃圾回收
-Xnoclassgc
这个选项用来取消系统对特定类的垃圾回收。它可以防止当这个类的所有引用丢失之后,这个类仍被引用时不会再一次被重新装载,因此这个选项将增大系统堆内存的空间
设置栈内存的大小
-Xss
这个选项用来控制本地线程栈的大小,当这个选项被设置的较大(>2MB)时将会在很大程度上降低系统的性能。因此在设置这个值时应该格外小心,调整后要注意观察系统的性能,不断调整以期达到最优
最后说一句,你的机器的连接数设置也至关重要,连接的关闭最好把时间设置的少些,那些连接非常耗费资源。也是引起内存泄露的主要原因。
6. 如何分析java.lang.outofmemoryerror
Java.lang.OutOfMemoryError是java.lang.VirtualMachineError的子类。在堆耗尽内存的时候,jvm会抛出Java.lang.OutOfMemoryError。这个错误大多数出现在当你去创建一个对象,但是在堆中却不能为这个对象分配足够多空间的时候。而且在java
api文档中,并没有对这个错误做大量的解释。
OutOfMemoryError的类型
在java中有两种主要的OutOfMemoryError类型:
(1) Java.lang.OutOfMemoryError: Java heap space
(2) Java.lang.OutOfMemoryError: PermGen space
尽管它们都发生在内存耗尽的情况下,但它们之间是相当不同的,它们的解决办法也是各不一样。
两种OutOfMemoryError之间的区别
如果你熟悉堆的历代版本和垃圾收集器的工作原理,并且知道到新的,老的和永久的堆空间,那么你将会非常容易解决OutOfMemoryError错误。永久的堆空间用于存储jvm相关类,方法和其他实体的字符串池和各种元数据。因为大多数jvm默认的Perm
Space(永久的堆空间)的大小是64M左右,所以如果你的工程里有太多的类或者数量巨大的字符串的话,那么很容易就会耗尽内存。需要指出的一点是它并不依赖”
Xmx”(译者注:
-Xms 指JVM初始分配的堆内存,-Xmx 指 JVM最大允许分配的堆内存)的值,所以不管你的堆空间多么大,一样会耗尽Perm
Space。好的办法是你可以根据工程的需要通过JVM的选项指定永久堆空间的大小,即"-XX:PermSize" and
"-XX:MaxPermSize"。
一个很小的事情是要记得在指定堆的Perm Space(永久的堆空间)的大小的时候需要用”=”来分离参数名称和值,但在指定堆得最大值的时候是不需要“=”的,正如下面的例子一样:
Export JVM_ARGS="-Xmx1024m -XX:MaxPermSize=256m"
"java.lang.OutOfMemoryError:
PermGen"的另一个原因是类加载器造成的内存泄漏,它经常出现在web服务器和应用服务器中,例如tomcat, webshere,
glassfish or
weblogic。在应用服务器中,不同的类加载器用于加载不同的web应用,以便在相同的服务器上部署和取消部署一个应用而且不会影响其他的应用程序。但是当取消部署的时候,如果容器持有类加载器已经加载的类的引用,那么这个类和相关的类就不会被垃圾回收器回收。如果你部署和取消部署你的应用很多次,那么很快PermGen
space就会被填满。"java.lang.OutOfMemoryError:
PermGen”在我们的上一个项目中的tomcat里已经被发现多次,但是这个问题的解决办法实在是令人捉摸不透。因为你首先知道哪个类引起了内存泄露,然后你才能修正它。这个问题的另一个原因是应用启动了一些线程,但是当取消部署的时候,这些线程并没有退出。
这只是一些臭名昭着的类加载器造成内存泄露的例子,任何人在编写加载类和取消加载类的代码的时候都要非常小心以避免这些问题。你也可以使用visualgc
监测PermGen space,这个工具会展示PermGen space的使用情况图表,你可以看到PermGen
space是怎样并且何时增长的。我建议在得出任何结论之前先使用这个工具。
关于"java.lang.OutOfMemoryError:
PermGen"的原因,我们发现另一个更加无知但有趣的是对于 JVM 的参数
"-Xnoclassgc"的介绍。这个选项用于避免加载和取消加载一些已经没有被引用的类,这样可以避免因为频繁的加载和取消加载而影响性能。但是在J2EE环境中使用这个选项是很危险的,因为许多框架,例如struts,spring等使用反射机制去创建类,并且会频繁的部署和取消部署,如果上一个引用没有被清除,那么很快PermGen
space就会被耗尽。这个例子也说明一些时候错误的JVM参数或配置也会引起OutOfMemoryError错误。
所以结论是不要在J2EE环境中使用"-Xnoclassgc",尤其是在应用服务器上。
Tomcat解决Java.lang.OutOfMemoryError: PermGen space错误的办法
对于tomcat6.0及其以上版本,提供了内存泄漏侦测的能力。它可以通过web应用视图展示一些侦测到的平常的内存泄漏问题,例如web应用中的ThreadLocal内存泄漏,JDBC驱动注册,RMI
,LogFactory和线程等。你可以在htp://wiki.apache.org/tomcat/MemoryLeakProtection
查看具体的细节,也可以通过tomcat提供的管理程序侦测内存泄漏。你如果想在web应用程序上检验内存泄漏问题,使用tomcat是个不错的主意。
如何解决java.lang.OutOfMemoryError: Java heap space
1)
解决OutOfMemoryError的简单方法是通过指定JVM参数"-Xmx512M"来指定最大的堆空间,这种方法效果立竿见影。当我使用eclipse,maven,ant编译工程遇到OutOfMemoryError的时候,我更喜欢使用这种办法。这里有一个增加JVM堆空间的例子,建议为你的程序增加堆空间的时候最好保持-Xmx
相比-Xms 是1:1或者1:1.5的比例。
例: export JVM_ARGS="-Xms1024m -Xmx1024m"
2)
第二种解决办法是很困难的,当你拥有的内存并不多或者在你增加了堆内存但是你依然会遇到OutOfMemoryError错误时,这种情况下你可能想要去分析你的应用程序并且寻找内存泄漏的原因。你可以使用Eclipse
Memory Analyzer来检查heap mp,或者可以使用Netbeans,
Jprobe等这些分析工具。这种方法比较困难,需要花费大量时间去分析找出内存泄漏的原因。
如何解决java.lang.OutOfMemoryError: PermGen space
正如前面讲到的一样,java.lang.OutOfMemoryError: PermGen
space发生在永久堆内存耗尽的情况下。要修正这个情况,需要通过JVM选项 "-XX:MaxPermSize"来增加Perm
space的最大大小,也可以通过"-XX:PermSize"指定Perm space的初始大小。同时设置这两个值,可以避免在Perm
Space重置大小的时候发生完全的垃圾回收。下面是设置初始化和最大值的例子:
export JVM_ARGS="-XX:PermSize=64M -XX:MaxPermSize=256m"
有时候java.lang.OutOfMemoryError是莫名其妙的,这种情况下分析是最终的解决办法。尽管你有增加堆内存的空间的自由,但还是建议遵循内存管理实践,在编码的时候将没用的引用设置为null。以上我对OutOfMemoryError的全部理解,我也在其他的一些帖子中努力写出java关于查找内存泄漏的文章和使用分析器的方法。希望你也能分享解决OutOfMemoryError的观点。
注意:
对于tomcat6.0及其以上版本,提供了内存泄漏侦测的能力。它可以通过web应用视图展示一些侦测到的平常的内存泄漏问题,例如web应用中的ThreadLocal内存泄漏,JDBC驱动注册,RMI
,LogFactory和线程等。你可以在htp://wiki.apache.org/tomcat/MemoryLeakProtection
查看具体的细节,也可以通过tomcat提供的管理程序侦测内存泄漏。你如果想在web应用程序上检验内存泄漏问题并且找到PermGen
space造成的OutOfMemoryError的原因,使用tomcat是个不错的主意。
调查修正OutOfMemoryError的工具
Java.lang.OutOfMemoryError是一种你需要做大量的调查才能找到根本原因的错误。没有对内存工具的足够了解,你不可能做某些事情,例如查找哪个对象在占用内存,占用了多少内存,以及找到可怕的内存泄漏等等。这里我列出一些免费的工具可以帮助你分析堆的使用情况,以及造成OutOfMemoryError的罪魁祸首。
1)Visualgc
Visualgc代表Visual
Garbage Collection Monitoring Tool 。你可以将它用于你的hostspot
JVM。Visualgc最大的优势是能生动展现出各种关键数据,包括类加载器,垃圾回收和JVM编译器性能数据。
JVM被识别是通过虚拟机的标识符,称为: vmid。你可以在这了解更多关于visualgc和vmid的东西。
2)Jmap
Jmap是来自JDK6的命令行工具,它允许你将堆的内存转储信息保存到文件中。而且很方便使用,如:jmap -mp:format=b,file=heapmp 6054
这里指定的内存转储的文件名称是heapmp,6054是java进程的PID。你可以通过"ps -ef”或者windows任务管理器或者“jps”工具(Java Virtual Machine Process Status Tool)查找PID.
3) Jhat
Jhat之前被称为hat (heap analyzer tool),现在它是JDK6的一部分,你可
以使用Jhat去分析"jmap"生成的文件。Jhat也是一个命令行工具,你可以在windows命令行这样使用它,如: jhat -J-Xmx256m heapmp
这里它会分析“heapmp”文件中的内存问题。当你启动Jhat后,它就会读取内存转储文件,并且在http端口监听。只需要通过浏览器进入端口,你就可以开始分析内存转储文件中的对象。Jhat默认监听7000端口。
4)Eclipse memory analyzer
Eclipse memory analyzer
(MAT)是来自eclipse基金会的一个分析java堆内存的工具。它能帮助你找到类加载器的泄漏,内存泄漏和减少内存消耗。你可以使用MAT分析内存转储中数以百万计的对象,也可以帮助你提取怀疑的内存泄漏。
7. Java开发工具主要有哪些
一 看书已经是一种落后的学习方式
我上大学的时候学习Java,也是通过看书的方式学习的,当时学的很费劲,只有死板的文字,整了一本厚厚的书,啃了将近一年,也是迷迷瞪瞪的,有长进,但不是太大。在书里涉及到一些实际操作的步骤的时候,通过软件表现,中间会遇到很多书里没说的问题,让人只能纠结。
二 与其看死板的书,不如看网上直播Java课程
现在我是一件公司的Java技术总监,技术实力那是一级棒的。在大学里,看了两三年的书,没什么长进,差点放弃了Java,但是放弃的话总觉的太可惜了,只能回锅在学习一些,但是当时面临的问题是什么呢,白天要工作,要创造利润生活啊,又不好意思跟家里要钱,所以导致我没时间去提升自己的技术实力,只能每天混日子。后来我一个朋友让我在网上看Java直播课程,每天晚上都是高手分享的,可以现场互动,我抱着试试看看的态度,在网上听了几天,都是晚上讲课,也不耽误我白天工作,让我欣喜的是,当在直播中看着老师的实战操作以及老师透彻的讲解,让我有一直茅塞顿开的感觉,很多困扰我很多年的问题,都解开了,原来看直播的学习效率,直接秒杀看书啊。当然好东西,要给大家一块分享,如果你想提升自己的Java实力,晚上有时间也可以来听听的,在这个群里,开头的前面几位是:557,然后在中间的一组是:101,位于最后位置的是:916,按照前后的顺序组合起来就ok了。
三 Java程序员新手老手都离不开八大开发工具
现在有很多库、实用工具和程序任Java开发人员选择。每个工具都有其优点,但其中有一些因它的知名度、多功能和有效力从众多选项中脱颖而出。
以下这8个工具,从代码构建到错误挤压,覆盖Java开发的全域。学习这些工具可以帮助你改善代码质量,成为一个更高效的Java开发人员。
1.Eclipse
尽管IntelliJ IDEA、NetBeans和一些其他的IDE正在日益普及,但是有调查表明,Eclipse仍然是几乎半数Java开发人员首选的开发环境。 Eclipse是IDE领域的瑞士军刀,有着大量定制的接口和无数的插件。它无处不在,后面本文将推荐的其他所有工具都提供Eclipse插件。
Eclipse的工作流程可分为三个方面:工作台,工作空间和视角。工作台作为到IDE的出发点。工作空间将项目、文件和配置设置组合在一个单独的 目录下。视角定义工具、视图和有效设置。虽然新手开发人员可能会觉得相比Netbeans和IntelliJ IDEA,Eclipse使用起来更难,但Eclipse的灵活,使其成为企业开发的首选IDE。
Luna,Eclipse的最新版本,支持Java 8、分屏编辑、新的黑色主题,以及一个功能齐全的命令行终端。
2.Gradle
Gradle是一个自动化项目工具,建立在Apache Maven和Apache Ant的功能上。虽然Gradle并不是非常流行的构建工具(超流行的是Maven,64%的Java开发人员会选择它),但它的普及速度很快。它也可作为默认的Android构建工具。
Gradle引以为傲的是它的简单。Gradle使用Groovy编程语言,与Maven和Ant使用XML语法截然相反。一个基本的Gradle构建文件由一行简单的代码组成:
3.Javadoc
Javadoc是Oracle提供的文档生成器。它可以将特殊格式的注释解析为HTML文档。以下截图就是Javadoc生成的Java SE 8 API规范:
Javadoc注释使用开放标签、关闭标签,以及一个或多个描述性标签的格式。开放式标签类似于标准Java多行注释标记,使用两个星号的除外。Javadoc也解析普通的HTML标签。
Javadoc自动格式化标签和关键字,除非另有规定。Javadoc广泛使用超链接,允许你参考和链接到代码的不同区域。许多IDE——包括 Eclipse——可以自动添加Javadoc注释模块到变量、类和方法中。支持Maven、Gradle和Ant的插件在编译代码的同时也可以构建 Javadoc HTML。
4.JUnit
JUnit是用于编写和运行单元测试的开源框架。一个基本的JUnit测试包括测试类、测试方法、以及执行测试的功能。 JUnit使用标注来确定测试如何构造和运行。例如,如果你的程序有一个类叫做MathClass,具有乘法和除法的方法,你可以创建JUnit测试来检 查不符合预期的值。输入数字2和5到乘法方法,你希望得到的结果为10。当输入0作为除法方法的第二个参数时,你会期望给出一个数字计算异常的警告因为除 数不能为0:
@Test标注规定,MathClass方法是一个测试用例。 在JUnit提供额外的标注,比如@Before,这样你就可以在测试运行之前设置环境。 JUnit还可以设置规则用于定义测试方法的行为。例如,TemporaryFolder规则使得一旦测试完成,由测试创建的文件或文件夹就会被删除。
5.Cobertura
Cobertura可用于分析Java代码的测试覆盖率。Cobertura根据没有被测试覆盖的代码生成基于HTML的报告。
Cobertura提供可用于插装、检查和测试代码的工具。通过监控可测试的代码,Cobertura允许你使用你选择的测试框架,甚至不需要测试框架就可以运行程序。
Cobertura根据行、分支和程序包三个方面给出代码覆盖报告。每个类别都有一个可自定义的阈值,如果覆盖面低于阈值,就会触发警告。Cobertura还集成了Maven和Gradle的自动检测功能。
6.FindBugs
FindBugs是一个匹配编译代码模式,而非使用bug数据库的工具。当提供源代码时,FindBugs还可高亮显示检测出bug的代码行。
在它的3.0.1版本中,FindBugs继续保持着数以百计的bug描述。根据bug的严重程度,FindBugs将bug分为四个水平:相关 的,令人困扰的,可怕的,以及最可怕的。除了图形用户界面,FindBugs还提供一个命令行界面,Ant任务,以及Eclipse插件。
7.VisualVM
包含在JDK中的VisualVM是监控和审查Java应用程序性能的工具。 VisualVM检测并重视活跃的JVM实例来检索有关进程的诊断信息。
VisualVM可以很容易地实时诊断性能问题。它提供了全套的分析工具,包括JConsole、jstack、jmap、jinfo和jstat等。此外,你还可以对JVM做一个快照,这样以后在任何时都能审查。
8.Groovy
Groovy是一种编程语言,通过添加新的关键字,自动导入常用的类,以及可选类型变量声明,既简化又扩展了Java。
Groovy的核心优势之一是它的脚本功能。类可以被编译为Java字节码或使用Groovy Shell动态执行。Groovy的Java基础使得它相较于Jython和JRuby更容易为Java开发人员所接受
三优秀Java程序员,应该养成哪些习惯
当我们评价一个程序员是否优秀时,要从多个方面进行评估。 专业技能、专业知识、创造力、经验,这些都是重要的因素。当然,还有他们的工作态度、工作效率和工作质量。如果程序员的工作是没有效率的,那就意味着他们所投入的时间和精力是没有效果的。最近看到一篇博文中,他们总结了10个影响程序员工作效率的坏习惯。看完这篇文章后你会发现,里面所列举的坏习惯,总有一两个可以在自己的身上找得到。从中你也可以学习到那些优秀的程序员是如何提高工作效率的。
1.专注于一个工作而不是同时处理多个任务同一时间处理多个工作任务,我们对这种情况并不陌生。有时候是迫不得已,但有时候也是个人的习惯造成的。“同一时间处理多个任务”看起来不错,给人感觉你的工作出色,但实际上,由于要不断转换工作内容,它会影响了你的专注力和创造力。对于程序员来说,专注于某一个开发工作是很重要的。如果要同时处理几个任务,你不得不为此消耗精力,这样一来工作效率就会降低了。解决的方法是做好工作安排,把相似的工作放在一起,专心做好一个工作直到它完成了为止,再去做下一个工作。
2.建立一个有条理的工作系统程序员给很多人的感觉是有点神经质的,就是那种专注起来令人倾心,糊涂起来让人抓狂的那种。他们可以投入到开发环境中不眠不休,但有很多人也会在工作中出现各种马虎,健忘和凌乱的状况。工作没有条理可以直接影响工作效率。其实这个毛病是可以改掉的,从办公桌上物件的摆放,到建立工作计划,一步一步地作好安排,制定一个井井有条的工作系统可以有助提高工作效率。你可以在livecoding上看一下其他程序员的直播,不仅可以发现一些有趣的项目,还可以留意一下人家是如何把每一件事情都处理得有条不紊的。优秀的程序员也许在生活中会有各种丢三拉四的表现,但一旦投入到工作中时,他们会变得非常专注和注重条理。
8. java有哪些性能分析工具 能分析具体jar包
利用以下工具都可以实现对xml 文件的解析 ,dom4j, jdom, SAX,DOM 如果是在java程序中解析xml文件,主要使用dom4j和jdom,dom4j用的比较多,诸多MVC框架及orm框架都是使用dom4j来解析xml文件的。 dom 方式则和语言无关的xml文件操作的国际标准。
9. Java内存泄露检测工具
1、Java的内存管理就是对象的分配和释放问题。 在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。 对象的释放是由GC决定和执行的。 在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法简化了程序员的工作。但也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。 GC释放空间方法: 监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。当该对象不再被引用时,释放对象。 2、内存管理结构 Java使用有向图的方式进行内存管理,对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况。 将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。 3、使用有向图方式管理内存的优缺点 Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。 这种方式的优点是管理内存的精度很高,但是效率较低。++:另外一种常用的内存管理技术是使用计数器,例如COM模型采用计数器方式管理构件,它与有向图相比,精度行低(很难处理循环引用的问题),但执行效率很高。★ Java的内存泄露 Java虽然由GC来回收内存,但也是存在泄露问题的,只是比C++小一点。 1、与C++的比较 c++所有对象的分配和回收都需要由用户来管理。即需要管理点,也需要管理边。若存在不可达的点,无法在回收分配给那个点的内存,导致内存泄露。存在无用的对象引用,自然也会导致内存泄露。 Java由GC来管理内存回收,GC将回收不可达的对象占用的内存空间。所以,Java需要考虑的内存泄露问题主要是那些被引用但无用的对象——即指要管理边就可以。被引用但无用的对象,程序引用了该对象,但后续不会再使用它。它占用的内存空间就浪费了。 如果存在对象的引用,这个对象就被定义为“活动的”,同时不会被释放。 2、Java内存泄露处理 处理Java的内存泄露问题:确认该对象不再会被使用。 典型的做法—— 把对象数据成员设为null 从集合中移除该对象 注意,当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。例子:List myList=new ArrayList();for (int i=1;i<100; i++)//此时,所有的Object对象都没有被释放,因为变量myList引用这些对象。 当myList后来不再用到,将之设为null,释放所有它引用的对象。之后GC便会回收这些对象占用的内存。★ 对GC操作 对GC的操作并不一定能达到管理内存的效果。 GC对于程序员来说基本是透明的,不可见的。我们只有几个函数可以访问GC,例如运行GC的函数System.gc(),System.。 但是根据Java语言规范定义, System.gc()函数不保证JVM的垃圾收集器一定会执行。因为,不同的JVM实现者可能使用不同的算法管理GC。通常,GC的线程的优先级别较低。 JVM调用GC的策略有很多种,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是平缓执行GC,有的是中断式执行GC。但通常来说,我们不需要关心这些。★
10. java内存检测工具JProfiler8.0和eclipse memory analyzer不能用。
虽然我具体的软件没有弄过但大体的思路知道,就当抛砖引玉了。
你的问题是heap OOM.一般会生成hprof的堆文件,你现在已经有了。
分析的时候不用考虑集成eclipse啊。很多工具比如jprofiler,JAVA自带的jvisualvm.exe直接就可以分析。你要找的软件就是分析JVM堆的软件就可以,如果比较大,可能需要调下初始参数-Xms -Xmx
使用软件打开后,主要去找那些占用空间非常大的,分析内存泄露的可能。而一种可能就是内存真的不够用了,你则可以使用jmeter等来分析。