- 浏览: 1578849 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
nich002:
原网站失效了。撸主简单粗暴的复制过来,可读性极差!差评!
Apache配置详解(最好的APACHE配置教程) -
107x:
不错,谢谢!
LINUX下查看文件夹下的文件个数! -
Hypereo:
好你妹,连个格式都没有!
Apache配置详解(最好的APACHE配置教程) -
resteater:
代码排版感觉有点乱!收发信息代码可读性不强!请问第一次发服务器 ...
java socket例子 -
resteater:
代码排版感觉有点乱!收发信息代码可读性不强!请问第一次发服务器 ...
java socket例子
From: http://blog.csdn.net/hantiannan/archive/2009/10/10/4651617.aspx
学习了一下JDK中的一些自带系统性能分析工具。 在jdk的bin目录下,jconsole,jstack、jmap、jstat、jhat jconsole 是监视和管理工具。可以查看堆内存,线程,类,CPU状况。直接双击就可以启动了,然后选择连接本地local还是远程remote,分析结果就出现在界面上了。当然也可以从命令行启动界面。 jstack 主要用于线程死锁的监控。 命令行中输入jstack -h查看用法 C:\Program Files (x86)\Java\jdk1.6.0_14\bin>jstack -h pid 进程号 命令行中输入jmap -h查看用法 C:\Program Files (x86)\Java\jdk1.6.0_14\bin>jmap -h jstat 主要用于监控jvm的gc使用情况。 命令行中输入jstat -h查看用法 C:\Program Files (x86)\Java\jdk1.6.0_14\bin>jstat -h pid 进程号,interval时间间隔,count次数 命令行中输入jhat -h查看用法 C:\Program Files (x86)\Java\jdk1.6.0_14\bin>jhat -h jhat filename.bin //就可以分析产生的dump文件,可以通过访问http://localhost:7000 IBM的堆分析工具HeapAnalyzer (http://www.alphaworks.ibm.com/tech/heapanalyzer )。堆的dump log的视图化查看工具。 TDA - Thread Dump Analyzer (https://tda.dev.java.net/ )。线程dump的视图化查看工具。
Usage:
jstack [-l] <pid>
(to connect to running process)
Options:
-l long listing. Prints additional infor
-h or -help to print this help message
jmap 主要用于监控内存泄露时候对象占用的字节数。
Usage:
jmap -histo <pid>
(to connect to running process and print histogram of java object heap
jmap -dump:<dump-options> <pid>
(to connect to running process and dump java heap)
dump-options:
format=b binary default
file=<file> dump heap to <file>
Example: jmap -dump:format=b,file=heap.bin <pid>
-h requires an integer argument
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
Definitions:
<option> An option reported by the -options option
<vmid> Virtual Machine Identifier. A vmid takes the following form:
<lvmid>[@<hostname>[:<port>]]
Where <lvmid> is the local vm identifier for the target
Java virtual machine, typically a process id; <hostname> is
the name of the host running the target Java virtual machine;
and <port> is the port number for the rmiregistry on the
target host. See the jvmstat documentation for a more complete
description of the Virtual Machine Identifier.
<lines> Number of samples between header lines.
<interval> Sampling interval. The following forms are allowed:
<n>["ms"|"s"]
Where <n> is an integer and the suffix specifies the units as
milliseconds("ms") or seconds("s"). The default units are "ms".
<count> Number of samples to take before terminating.
-J<flag> Pass <flag> directly to the runtime system.
jhat 主要用于分析jmap产生的dump并提供web页面查看分析结果。
Usage: jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-
debug <int>] [-version] [-h|-help] <file>
-J<flag> Pass <flag> directly to the runtime system. For
example, -J-mx512m to use a maximum heap size of 512MB
-stack false: Turn off tracking object allocation call stack.
-refs false: Turn off tracking of references to objects
-port <port>: Set the port for the HTTP server. Defaults to 7000
-exclude <file>: Specify a file that lists data members that should
be excluded from the reachableFrom query.
-baseline <file>: Specify a baseline object dump. Objects in
both heap dumps with the same ID and same class will
be marked as not being "new".
-debug <int>: Set debug level.
0: No debug output
1: Debug hprof file parsing
2: Debug hprof file parsing, no server
-version Report version number
-h|-help Print this help and exit
<file> The file to read
For a dump file that contains multiple heap dumps,
you may specify which dump in the file
by appending "#<number>" to the file name, i.e. "foo.hprof#3".
All boolean options default to "true"
评论
http://blog.csdn.net/airobot008/article/details/3951524
jstatd -J-Djava.security.policy=jstatd.all.policy
[root@ logs]# jhat -J-mx4096m -port 700 a.map
From:http://lzmhehe.iteye.com/blog/335526
Thread Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的thread-dump的能力。虽然各个Java虚拟机thread dump打印输出格式上略微有一些不同,但是Thread dumps出来的信息包含线程;线程的运行状态、标识和调用的堆栈;调用的堆栈包含完整的类名,所执行的方法,如果可能的话还有源代码的行数。
Thread Dump特点:
能在各种操作系统下使用
能在各种Java应用服务器下使用
可以在生产环境下使用而不影响系统的性能
可以将问题直接定位到应用程序的代码行上
Thread Dump能诊断的问题包括:
查找内存泄露,常见的是程序里load大量的数据到缓存
发现死锁线程
Sun的JVM用下列方法可以产生Thread Dump堆栈信息:
1,Solaris OS
<ctrl>-’\’ (Control-Backslash)
kill -QUIT <pid>
2, HP-UX/UNIX/Linux
Kill -3 PID
PID通过下面方法获取
ps -efHl | grep 'java' **. **
3,Windows
直接对MSDOS窗口的程序按Ctrl-break
有些Java应用服务器是在控制台上运行,如Weblogic,为了方便获取threaddump信息,在weblogic启动的时候,最好将其标准输出重定向到一个文件,用"nohup sh startWebLogic.sh > start.log &"命令,执行"kill -3 <pid>",Stack trace就会输出到start.log里。Tomcat的Thread Dump会输出到命令行控制台或者logs的catalina.out文件里。为了反映线程状态的动态变化,需要接连多次做thread dump,每次间隔10-20s。
IBM JVM下产生Thread Dump:
在AIX上用IBM的JVM,内存溢出时默认地会产生javacore文件(关于cpu的)和heapdump文件(关于内存的)。如果没有参照下列方法:
1 choose one cluster member, set the following before this server start:
在was启动前设置下面环境变量(可以加在启动脚本中)
export IBM_HEAPDUMP=true
export IBM_HEAP_DUMP=true
export IBM_HEAPDUMP_OUTOFMEMORY=true
export IBM_HEAPDUMPDIR=<directory path>
2 please use set command to make sure you do not have DISABLE_JAVADUMP parameter
then start this cluster member.
用set命令检查参数设置,确保没有设置DISABLE_JAVADUMP,然后启动server
3 when you find free memory < 50% when no heavy access, please run kill -3 <pid>
执行kill -3 <pid>命令可以生成javacore文件和heapdump文件(pid为was java进程的id号,可以用ps -ef|grep java 查到),可以多执行几次,按照下面操作进行
ps -ef > psef1.txt
ps aux > psaux1.txt
vmstat 5 10 > vmstat.txt
kill -3 <app server id>
wait for 2 mins
kill -3 <app server id>
wait for 2 mins
kill -3 <app server id>
netstat -an> netstat2.txt
ps -ef > psef2.txt
ps aux > psaux2.txt
将上面产生的 txt 文件和/usr/WebSphere/AppServer/javacore*文件和heapdump文件拷贝到本地,然后删除这些文件,因为这些文件会占用较大的文件系统空间。
将/usr/WebSphere/AppServer/logs/wlmserver1(或2)目录下当天产生的日志拷贝出来
在IBM JVM产生的javacore或者Threaddump文件中应用服务器Web容器的常见线程状态:
Idle线程:一个已经准备好接受请求的线程,但是没有和插件或者客户端建立连接
Keep-Alive线程:是一个已经准备好接受请求的线程,并且已经和插件或者客户端建立连接
正在接受请求的线程:是一个线程正在读取request的内容或者头部
下面就给出各种线程在javacore或者Threaddump中的表现形式:
Idle线程:
"Servlet.Engine.Transports : 20" (TID:0x427F190, sys_thread_t:0x15D175E8, state:R, native ID:0xBB8) prio=5
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:429)
at com.ibm.ws.util.BoundedBuffer.take(BoundedBuffer.java:161)
at com.ibm.ws.util.ThreadPool.getTask(ThreadPool.java(Compiled Code)) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(Compiled Code))
Keep-alive线程 (非SSL模式):
"Servlet.Engine.Transports : 20" (TID:0x427F190, sys_thread_t:0x15D175E8, state:R, native ID:0xBB8) prio=5
at java.net.SocketInputStream.socketRead(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:86)
at com.ibm.ws.io.Stream.read(Stream.java)
at com.ibm.ws.io.ReadStream.readBuffer(ReadStream.java)
at com.ibm.ws.io.ReadStream.read(ReadStream.java)
at com.ibm.ws.http.HttpRequest.readRequestLine(HttpRequest.java)
at com.ibm.ws.http.HttpRequest.readRequest(HttpRequest.java)
at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java)
at com.ibm.ws.http.HttpConnection.run(HttpConnection.java)
at com.ibm.ws.util.CachedThread.run(ThreadPool.java)
Keep-alive线程 (SSL模式):
"Servlet.Engine.Transports : 12" (TID:0x458DBA18, sys_thread_t:0x60B297C0, state:R, native ID:0x427E) prio=5
at java.net.SocketInputStream.socketRead(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java(Compiled Code))
at com.ibm.sslite.s.a(Unknown Source)(Compiled Code)
at com.ibm.sslite.s.b(Unknown Source)(Compiled Code)
at com.ibm.sslite.s.a(Unknown Source)(Compiled Code)
at com.ibm.sslite.a.read(Unknown Source)(Compiled Code)
at com.ibm.jsse.a.read(Unknown Source)(Compiled Code)
at com.ibm.ws.io.Stream.read(Stream.java(Compiled Code))
at com.ibm.ws.io.ReadStream.readBuffer(ReadStream.java(Inlined Compiled Code))
at com.ibm.ws.io.ReadStream.read(ReadStream.java(Inlined Compiled Code))
at com.ibm.ws.http.HttpRequest.readRequestLine(HttpRequest.java(Compiled Code))
at com.ibm.ws.http.HttpRequest.readRequest(HttpRequest.java(Compiled Code))
at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection)
at com.ibm.ws.http.HttpConnection.run(HttpConnection.java(Compiled Code))
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:672)
正在接受请求的线程:
at java.net.SocketInputStream.socketRead(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:85)
at com.ibm.ws.io.Stream.read(Stream.java:17)
at com.ibm.ws.io.ReadStream.readBuffer(ReadStream.java:411)
at com.ibm.ws.io.ReadStream.read(ReadStream.java:110)
at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:448)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:672)
Sun JVM的常见线程状态:
对于thread dump信息,主要关注的是线程的状态和其执行堆栈
线程的状态一般为三类
Runnable(R):当前可以运行的线程
Waiting on monitor(CW):线程主动wait
Waiting for monitor entry(MW):线程等锁
一般关注的都是第一和第三种状态的线程
Cpu很忙则关注runnable的线程
Cpu闲则关注waiting for monitor entry的线程
一种典型的死锁是由于在server端应用(比如servlet)中请求由同一weblogic实例server的资源
解决办法就是将该servlet放到另外的执行队列里去执行
下面给出一个典型的死锁线程(注意STUCK关键字):
"[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=02fe9a18 nid=35 lwp_id=7518924 runnable [440dd000..440db878]
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:134)
at weblogic.jdbc.oracle.net8.OracleDataProvider.getArrayOfBytesFromSocket(Unknown Source)
at weblogic.jdbc.oracle.net8.OracleDataProvider.readFirstPacketInBuffer(Unknown Source)
at weblogic.jdbc.oracle.net8.OracleDataProvider.readPacket(Unknown Source)
at weblogic.jdbc.oracle.net8.OracleDataProvider.receive(Unknown Source)
at weblogic.jdbc.oracle.net8.OracleNet8NSPTDAPacket.sendRequest(Unknown Source)
at weblogic.jdbc.oracle.OracleImplStatement.fetchNext(Unknown Source)
at weblogic.jdbc.oracle.OracleImplStatement.fetchNext2(Unknown Source)
at weblogic.jdbc.oracle.OracleImplResultset.fetchAtPosition(Unknown Source)
at weblogic.jdbc.base.BaseImplResultSet.next(Unknown Source)
at weblogic.jdbc.base.BaseResultSet.next(Unknown Source)
- locked <55f25550> (a weblogic.jdbc.oracle.OracleConnection)
at weblogic.jdbc.wrapper.ResultSet_weblogic_jdbc_base_BaseResultSet.next(Unknown Source)
at org.hibernate.loader.Loader.doQuery(Loader.java:685)
UNIX/Linux下可用top、vmstat或prstat命令观察系统资源状况
-
文章出处:http://www.diybl.com/course/3_program/java/javajs/20081012/150147.html
如何分析Java虚拟机死锁
中文资料:
我发现现在网上没有好好讲这个的,少数的几篇文章都是大谈自己的工具,却没把方法讲清楚。我决定以我以前碰到的case为例写一篇来分享。到目前为止,我认为分析Java代码问题的最有效的工具仍然是java thread dump。
原因:
- 任何操作系统平台下都可以使用。
- 在多数情况下,可以在生产环境中使用。
- 和操作系统提供的工具相比,java thread dump给出的信息是直白的,直接对应到应用代码。
- 它对被分析的系统干扰很小,因此能反应真实的问题。而其它很多profiling或Instrument工具本身对JVM运行有很大的干扰,经常不能暴露出真正的问题,而且这种工具不能用于生产系统。
我觉得在通常情况下分析Java虚拟机死锁比分析内存泄漏要容易的多。因为死锁发生时,JVM通常处于挂起状态(hang住了),thread dump可以给出静态稳定的信息,查找死锁只需要查找有问题的线程。而内存泄漏的问题却很难界定,一个运行的JVM里有无数对象存在,只有写程序的人才知道哪些对象是垃圾,而哪些不是,而且对象的引用关系非常复杂,很难得到一份清晰的对象引用图。
Java虚拟机死锁发生时,从操作系统上观察,虚拟机的CPU占用率为零,很快会从top或prstat的输出中消失。这时你就可以收集thread dump了,Unix/Linux 下是kill -3 <JVM pid> ,在Windows下可以在JVM的console窗口上敲Ctrl-Break。根据不同的设置,thread dump会输出到当前控制台上或应用服务器的日志里。
拿到java thread dump后,你要做的就是查找"waiting for monitor entry"的thread,如果大量thread都在等待给同一个地址上锁(因为对于Java,一个对象只有一把锁),这说明很可能死锁发生了。比如:
"service-j2ee" prio=5 tid=0x024f1c28 nid=0x125 waiting for monitor entry
[62a3e000..62a3f690]
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
com.sun.enterprise.resource.IASNonSharedResourcePool.internalGetResource(IASNonS
haredResourcePool.java:625)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: - waiting to
lock <0x965d8110> (a com.sun.enterprise.resource.IASNonSharedResourcePool)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
com.sun.enterprise.resource.IASNonSharedResourcePool.getResource(IASNonSharedRes
ourcePool.java:520)
................
为了确定问题,常常需要在隔两分钟后再次收集一次thread dump,如果得到的输出相同,仍然是大量thread都在等待给同一个地址上锁,那么肯定是死锁了。
如何找到当前持有锁的线程是解决问题的关键。方法是搜索thread dump,查找"locked <0x965d8110>", 找到持有锁的线程。
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: "Thread-20" daemon prio=5 tid=0x01394f18
nid=0x109 runnable [6716f000..6716fc28]
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
java.net.SocketInputStream.socketRead0(Native Method)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
java.net.SocketInputStream.read(SocketInputStream.java:129)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at oracle.net.ns.Packet.receive(Unknown
Source)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
oracle.net.ns.DataPacket.receive(Unknown Source)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
oracle.net.ns.NetInputStream.read(Unknown Source)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
oracle.net.ns.NetInputStream.read(Unknown Source)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
oracle.net.ns.NetInputStream.read(Unknown Source)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
oracle.jdbc.ttc7.MAREngine.unmarshalUB1(MAREngine.java:929)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:893)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
oracle.jdbc.ttc7.Ocommoncall.receive(Ocommoncall.java:106)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
oracle.jdbc.ttc7.TTC7Protocol.logoff(TTC7Protocol.java:396)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: - locked <0x954f47a0> (a
oracle.jdbc.ttc7.TTC7Protocol)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
oracle.jdbc.driver.OracleConnection.close(OracleConnection.java:1518)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: - locked <0x954f4520> (a
oracle.jdbc.driver.OracleConnection)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
com.sun.enterprise.resource.JdbcUrlAllocator.destroyResource(JdbcUrlAllocator.java:122)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
com.sun.enterprise.resource.IASNonSharedResourcePool.destroyResource(IASNonSharedResourcePool.java:8
72)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
com.sun.enterprise.resource.IASNonSharedResourcePool.resizePool(IASNonSharedResourcePool.java:1086)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: - locked <0x965d8110> (a
com.sun.enterprise.resource.IASNonSharedResourcePool)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
com.sun.enterprise.resource.IASNonSharedResourcePool$Resizer.run(IASNonSharedResourcePool.java:1178)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
java.util.TimerThread.mainLoop(Timer.java:432)
[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr: at
java.util.TimerThread.run(Timer.java:382)
在这个例子里,持有锁的线程在等待Oracle返回结果,却始终等不到响应,因此发生了死锁。
如果持有锁的线程还在等待给另一个对象上锁,那么还是按上面的办法顺藤摸瓜,直到找到死锁的根源为止。
另外,在thread dump里还会经常看到这样的线程,它们是等待一个条件而主动放弃锁的线程。例如:
"Thread-1" daemon prio=5 tid=0x014e97a8 nid=0x80 in Object.wait() [68c6f000..68c6fc28]
at java.lang.Object.wait(Native Method)
- waiting on <0x95b07178> (a java.util.LinkedList)
at com.iplanet.ias.util.collection.BlockingQueue.remove(BlockingQueue.java:258)
- locked <0x95b07178> (a java.util.LinkedList)
at com.iplanet.ias.util.threadpool.FastThreadPool$ThreadPoolThread.run(FastThreadPool.java:241)
at java.lang.Thread.run(Thread.java:534)
有时也会需要分析这类线程,尤其是线程等待的条件。
其实,Java thread dump并不只用于分析死锁,其它Java应用运行时古怪的行为都可以用thread dump来分析。
最后,在Java SE 5里,增加了jstack的工具,也可以获取thread dump。在Java SE 6里, 通过jconsole的图形化工具也可以方便地查找涉及object monitors 和java.util.concurrent.locks死锁。
发表评论
-
JVM问题追查与调优
2012-03-27 14:44 1149JDK的几种分析工具 http://liudaoru ... -
NodeJs相关资料
2011-08-18 14:55 3020NodeJs获取参数: proces ... -
jprofiler追踪问题
2011-08-12 18:20 1052Jprofiler下载页: http://www.ej ... -
Linux服务器性能评估与优化【z】
2011-07-01 10:05 1557来自:http://www.itlearner.com/ ... -
Java 理论与实践: 非阻塞算法简介【z】
2011-03-26 20:39 1288From: http://www.ibm.com/develo ... -
Java Crash问题分析[z]
2011-03-23 14:41 5978参考: http://www.ibm.com/develop ... -
Berkeley DB相关
2010-09-25 22:17 1061为什么要使用Berkeley DB,它适合什么场合应用?Ber ... -
熟悉系统方法总结
2010-07-06 14:26 824了解一个陌生的系统是我们经常碰到的事情,下面总结一下自己的一些 ... -
Java缓存框架 EhCache
2010-07-06 14:09 4734From: http://www.oschina.net/p/ ... -
【nio】使用 ServerSocketChannel 实现的 File 服务器[z]
2010-05-21 17:31 3978From: http://www.java2000.net/p ... -
Memcached命令行管理
2010-03-15 11:18 4495From: http://www.exp2up.com/2 ... -
(转)Resin服务器配置指南
2010-01-21 15:35 3471From:http://blog.21cn.com/super ... -
Flickr架构
2010-01-11 09:52 1273From: http://www.cyask.com/ques ... -
XMemcached——一个新的开源Java memcached客户端
2009-10-23 09:27 1899From: http://www.infoq.com/cn/ ... -
多线程任务调度学习
2009-10-16 13:58 2308昨天找到一套多线程任务调度的代码,相当的不错,先把思路总结一下 ... -
用HSCALE实现MySQL的数据分布式存储
2009-10-15 12:47 3023From:http://www.ningoo.net/ht ... -
马化腾:搜索、电子商务硬仗一定要坚持打
2009-10-15 12:09 1724From:http://www.techweb.com.c ... -
MySQL分表实现上百万上千万记录分布存储的批量查询设计模式【z】
2009-10-15 09:56 3179From:http://hi.baidu.com/jabber ... -
nginx负载均衡和lvs负载均衡的比较分析【z】
2009-10-13 20:02 1478From:http://www.shouker.com/u ... -
新型的大型bbs架构(squid+nginx)【z】
2009-10-13 19:53 1630From:http://www.fovweb.com/opti ...
相关推荐
此外,JDK 1.6还包含了丰富的开发工具,如`javadoc`用于生成API文档,`jmap`用于分析堆内存,`jconsole`用于监视JVM性能等,这些工具对于调试和优化Java应用程序至关重要。 总的来说,JDK 1.6作为一款成熟的开发...
例如,使用 `jmap -dump:live,format=b,file=<filename> <pid>` 可以生成堆的快照文件,方便后续使用内存分析工具(如MAT、JVisualVM等)进行分析。 ### JSTACK JSTACK用于生成当前JVM中所有线程的堆栈跟踪,这对于...
如果出现错误,可以使用JDK提供的工具,如`javadoc`生成API文档,`jstack`分析线程状态,`jconsole`监控Java应用性能等。 9. **使用IDE集成**:许多集成开发环境(IDE),如Eclipse、IntelliJ IDEA和NetBeans,提供...
5. **Java性能分析工具**:如jconsole、jvisualvm等,用于监控和分析Java应用程序的性能。 6. **Java打包工具** (jar):用于创建和管理Java归档文件(.jar文件),便于分发和运行包含多个类的Java程序。 7. **Java...
6. **Java性能分析工具(jconsole、jvisualvm等)**:这些工具可以帮助开发者监控和分析Java应用的性能,例如内存使用、线程状态、CPU消耗等。 在JDK1.8.0_31中,有几个重要的特性引入和改进: 1. **Lambda表达式*...
2. **Stream API**:Stream API提供了一种对集合数据进行声明性处理的新方式,支持过滤、映射、归约等操作,使得并行处理和数据流分析更为简便。例如,`List<String> names = Arrays.asList("Alice", "Bob", ...
通过上述分析,我们可以看出JDK动态代理是一种非常强大且灵活的技术,它不仅可以帮助我们解决实际开发中遇到的问题,还能够提高代码的可维护性和可扩展性。理解其工作原理对于深入学习Java编程有着重要意义。
9. **jdk.jcmd**:JDK命令行工具,提供了许多用于诊断、管理和操作JVM的命令,如JVM信息查询、堆内存分析、垃圾收集等。 10. **jdk.dynalink**:动态链接库,提供了一种方式来在运行时动态绑定方法调用,通常用于...
4. **开发者工具**:如javadoc生成文档,jconsole进行JVM监控,jmap进行内存分析,jstack用于线程堆栈跟踪等,这些都是开发者日常调试和性能优化的重要工具。 **二、JDK 1.7的新特性** 1. **动态类型语言支持**:...
8. **类型注解**:增强了类型系统的元数据能力,允许在类型签名上使用注解,有助于编译器和静态分析工具提供更精确的检查。 9. **并发改进**:`ForkJoinPool`和`Parallel Streams`的引入,优化了多线程计算,提高了...
6. **Java Mission Control (JMC)**:在JDK8中引入,是一个高级性能分析和故障排除工具,特别适合于复杂的应用服务器环境。 7. **Java Management Extensions (JMX)**:提供了一种管理和监控Java应用程序的标准框架...
11. **JFR(Java Flight Recorder)和JMC(Java Mission Control)**:这些工具用于性能分析和诊断,JDK 21可能会提供更多的监控指标和更强大的分析功能。 12. **动态语言支持**:JDK 21可能继续加强对动态语言的...
JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的核心工具集。JDK 1.7,也被称为Java 7,是Java平台的一个重要版本,发布于2011年7月。这个版本引入了许多新特性、优化和改进,旨在提高...
6. **Java Mission Control (JMC)**:一套强大的Java应用性能分析工具,包括飞行记录器、分析器和可视化工具。 二、JDK 11的新特性与改进 JDK 11作为长期支持(LTS)版本,引入了一系列新特性,包括: 1. **模块...
它包含了Java编译器(javac)、Java虚拟机(JVM)、Java运行时环境(JRE)以及一系列的开发工具,如Java文档生成器(javadoc)、性能分析工具(jmap)等。 2. **jdk1.8**: 这是JDK的一个特定版本,也被称为Java 8。...
8. **开发工具和库**:包括如`jconsole`(JMX控制台)、`jmap`(内存映射工具)、`jhat`(堆转储分析工具)以及大量的Java类库,如`rt.jar`(运行时类库)和`charsets.jar`(字符集库)。 9. **安全更新**:JDK...
在开发过程中,JDK 17.0.8提供了强大的Java编译器(javac)、性能分析工具(jconsole、jvisualvm等)和诊断工具(jmap、jstack等),帮助开发者优化代码、定位问题。此外,JDK还包括Java运行时(JRE)组件,使得...
7. **Java Mission Control(JMC)**:这是一个强大的性能分析工具,用于监控和分析Java应用程序的运行状况。 8. **Java Flight Recorder(JFR)**:这个组件可以记录应用程序的详细事件,用于性能分析和故障排查。...
7. **Java性能分析工具**:如jconsole、jvisualvm等,可以帮助开发者监控和分析应用程序的性能。 在JDK1.8中,有几个重要的特性引入: - **Lambda表达式**:允许以简洁的方式表示匿名函数,简化多线程编程和函数...
JavaCore分析工具是一款专为Java开发者和系统管理员设计的实用工具,主要用于分析和理解Java应用程序的Javacore文件。Javacore是Java虚拟机(JVM)在遇到问题时生成的一种转储文件,包含了关于JVM运行时状态的重要...