以前做过profile,但是从来没有仔细研究过,最近在一次调优之中,对performance有了很深的认识。详细来研究一下。对于java的profile,可以分为简单的profile和run time的profile。
1.简单的profile:
可以制定目标,看看程序到底慢在哪里。一般不会涉及到程序逻辑的调优与架构的更改。目的就是在真实的应用deploy的时候,对jvm参数进行调优。这里主要可以调的就是gc,使用那个gc算法,以及对gc算法进行具体的优化。对于server端的程序而言,一般都是需要高吞吐率,这样一般都会使用并行gc,在这里需要限制gc线程个数,因为默认的话,会启动n-1个线程,这样可能造成竞争与资源浪费。具体调成几个,需要根据应用以及硬件环境来看。第二个需要调heap的大小,这个一般调调就可以了,比较重要的是,根据per request的机制,或者应用的场景,需要对young generation或者old generation进行调优,一般来讲我们都不希望发生full gc,或者出现young generation分配不了,而频繁的进行PSYoung,我发现这个时候,基本上就会lock住相应的heap part,而应用基本上处于停止状态。对于young generation停止的状况,需要对young的初始大小进行优化,观察应用,适当的调整-XX:NewSize,使得初始值足够使用,这样就不会发生停顿现象。
2.run time profile
这里主要针对程序速度慢来说的,也就是response time。主要原理就是找hot spot,哪里是hot spot就改哪里。也比较有可能的是1.有lock contention导致cpu利用率居高不下,这是可以考虑lock free,或者缩短lock的时间。2.大量临时对象,导致剧烈的gc。这个可能需要看去调gc,或者可以使用对象池之类的技术。
实际上java的profile是基于agent的,参考:
http://java.sun.com/developer/technicalArticles/Programming/HPROF.html
可以针对cpu, heap, monitor进行profile。
java -Xrunhprof:help
Option Name and Value Description Default
--------------------- ----------- -------
heap=dump|sites|all heap profiling all
cpu=samples|times|old CPU usage off
monitor=y|n monitor contention n
format=a|b text(txt) or binary output a
file=<file> write data to file java.hprof[{.txt}]
net=<host>:<port> send data over a socket off
depth=<size> stack trace depth 4
interval=<ms> sample interval in ms 10
cutoff=<value> output cutoff point 0.0001
lineno=y|n line number in traces? y
thread=y|n thread in traces? n
doe=y|n dump on exit? y
msa=y|n Solaris micro state accounting n
force=y|n force output to <file> y
verbose=y|n print messages about dumps y
Obsolete Options
----------------
gc_okay=y|n
Examples
--------
- Get sample cpu information every 20 millisec, with a stack depth of 3:
java -agentlib:hprof=cpu=samples,interval=20,depth=3 classname
- Get heap usage information based on the allocation sites:
java -agentlib:hprof=heap=sites classname
Notes
-----
- The option format=b cannot be used with monitor=y.
- The option format=b cannot be used with cpu=old|times.
- Use of the -Xrunhprof interface can still be used, e.g.
java -Xrunhprof:[help]|[<option>=<value>, ...]
will behave exactly the same as:
java -agentlib:hprof=[help]|[<option>=<value>, ...]
Warnings
--------
- This is demonstration code for the JVMTI interface and use of BCI,
it is not an official product or formal part of the JDK.
- The -Xrunhprof interface will be removed in a future release.
- The option format=b is considered experimental, this format may change
in a future release.
看了之后,对profile有了一些认识:
1.cpu=samples,基本上主要用这个,他并不是你调用了多少次方法的samples,而是当前stack的active frame上进行查找的,所以说基本上这个在前面的,可以认为时间比较长。
2.具体的可以通过cpu=times来verify一下,看看到底是不是时间很长。
3.在查看是哪个对象分配了内存的时候,觉得通过heap=sites,thread=y很方便。
4.monitor=y可以看lock的竞争,ms只能看synchronized块,也就是monitor enter,而concurrent包中的Lock目前还不能。估计只能通过人肉了。
目前只研究到这么多。
转自:http://hi.baidu.com/jeffeyliu/blog/item/535ec3afd2b150edfaed5055.html
分享到:
相关推荐
yourkit java profile,查看jvm的工具,图形化,功能强大
### 二、Profile Java 相关知识点 #### 1. Profile 在 Java 中的应用 在 Java 应用程序中,配置文件 (Profile) 是一种常见的用于存储应用程序设置和参数的文件。它们通常用于定义不同的环境配置(如开发、测试或...
Java @Profile注解详解 Java @Profile注解是Spring框架提供的一种根据当前环境动态激活和切换一系列组件的功能。通过使用@Profile注解,我们可以指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下...
yourkit java profiler 2015 注册码 实测可进行正常安装 服务器进程内存分析不可多得的工具
YourKit Java Profiler 2017 破解版本,仅供学习交流,如需商用,请到官方网站下载正版软件
iObjects Java提供ProfileService类来执行这个任务: ```java ProfileService profileService = new ProfileService(url); ProfileParameters params = new ProfileParameters(); params.setDataSourceName(layer....
这篇博客“facebook rest api java简单实现”可能详细讲解了如何在Java环境中设置和使用这些库来执行API请求。 首先,我们需要理解REST(Representational State Transfer)的基本概念,它是Web服务的一种设计风格...
`.profile`文件是Unix/Linux系统中的一个个人配置文件,它定义了用户的环境变量,包括PATH变量,这对于切换Java版本至关重要。这篇内容将详细介绍如何利用`.profile`文件在Ubuntu中切换Java版本。 首先,我们解压缩...
2. Java MIDP:Java MIDP(Mobile Information Device Profile)是一种Java Profile,用于开发移动设备上的应用程序。 3. J2ME(Java 2 Platform, Micro Edition):J2ME是一种Java平台,用于开发移动设备上的应用...
- 在StarUML中,为了能够处理Java文件,需要在“Model”菜单下的“Profiles”中插入“Java Profile”。 6. **反向工程与流程图生成**: - 在设计界面的空白处右键选择“JAVA” -> “Reverse Engineer”,将Java源...
在Java世界中,Java Persistence API (JPA) 是一种用于管理关系数据库的对象关系映射(ORM)工具。本文主要探讨的是JPA中的`@OneToOne`注解,它用于建立两个实体之间的一对一关联关系。在实际开发中,这种关联关系...
确保包含“JAVA Profile”,因为它定义了与Java语言相关的UML元素和约束。 6. **保存工程**: 为了防止意外丢失信息,应及时保存工程,通过“File”菜单的“Save”选项,选择合适的保存位置。 7. **创建图表**: ...
- 通过"Model/Profile..."菜单选择所需的Profile,比如"JAVA Profile",以确保遵循Java编程规范。 5. **保存工程** - 为了防止意外丢失信息,应尽早保存工程,通过"File/Save"选择保存位置。 6. **创建类图** -...
Profile定义了工程的规则和约定,确保包含了“JAVA Profile”,以便符合Java编程规范。 **保存工程** 为了防止意外丢失工作,建议在开始建模前立即保存工程。在“File”菜单中选择“Save”,选择保存位置。 **创建...
在“Model/Profile...”菜单中,应包含“JAVA Profile”,以保证与Java语言的兼容性。在保存工程时,为了避免意外丢失工作,建议用户经常使用“File/Save”功能保存进度。 在设计图表的过程中,用户可以从左侧的...
- **Personal Java Profile (PJP)**:针对更复杂的设备,增加了更多的Java SE功能。 - **Connected Device Configuration (CDC)**:针对内存和处理能力更大的设备,支持更完整的Java SE API。 **4. MIDlet Suite** ...
在StarUML中,通过“Model/Profile...”设置所需的Profile,如“JAVA Profile”,以便遵循Java编程语言的规范。 8. **工程管理**:在开始建模之前,需要创建新工程。在StarUML中,选择“Empty Project”作为初始...
一定要包含"JAVA Profile"这一工程。 保存工程 立即就保存工程,这样在出现问题的时候,你就不会丧失信息。从“File”菜单,选择“Save”,并选择一个地方以保存工程。 创造图表 现在,开场真正创造图表,从默认...