1.下载地址:http://www.ej-technologies.com/download/jprofiler/files

2.使用过程

1.点击此图的new Session

2.点击左边application settings,右边要点击

3.点击的Source Path ,点击+号的图标,点击add directory

4.点击你工程的文件到bin

5.左边是程序还没有运行的,右边是查询运行的

6.点击你的项目双击俩下,或者点open,之后点击OK就好了

7.点击CPU view,点击Call Tree,之后点击界面的一个按钮

8.这是一张CUP的图,图中显示个个方法的使用占的CPU

9.从中发现最大块的函数对其进行分解优化,以及减少代码块的重复率。

下面举个例子:查重模块中调用到了diaoyong的方法,diaoyong方法调用到addcopy的方法,这样就把200行左右的代码分成了7个方法,每个方法的代码不多于50行。

1.最大函数块

import java.util.ArrayList;
import java.util.List; /**
* 查重的总函数
* @author admin
*
*/
public class CongFu2 {
/**
* 查重
*/
public boolean chacong(List<String> timus,String yunsuan){
boolean flat=false;//获取是否重复的标记
boolean zhuzhifu=false;//在flat为true的时候,终止本次循环的标志
for(String s:timus){
if(!zhuzhifu){
List<String> str1=new ArrayList<String>();//获取已经存入在list中的题目
List<String> str2=new ArrayList<String>();//获取这次尝试的题目
for(int i=0;i<s.length();i++){
str1.add(s.charAt(i)+"");
str2.add(yunsuan.charAt(i)+"");
}
flat=false;
for(int i=0;i<str1.size();i++){
if(!str1.contains(str2.get(i))
||!str2.contains(str1.get(i))){
break;
}else{
if(i==str1.size()-1){
flat=true;
}
}
}
if(flat){
flat=false;
switch (str2.get(1)) {
case "+":
flat=false;
switch (str2.get(3)) {
case "+":
flat=true;
break;
case "-":
if(str2.get(4).equals(str1.get(4))
&&str2.get(3).equals(str1.get(3))
||str2.get(3).equals(str1.get(1))
&&str2.get(4).equals(str1.get(2))){
flat=true;
}
break;
case "/":
if(str2.get(2).equals(str1.get(2))
&&str2.get(3).equals(str1.get(3))
&&str2.get(4).equals(str1.get(4))
||str2.get(2).equals(str1.get(0))
&&str2.get(3).equals(str1.get(1))
&&str2.get(4).equals(str1.get(2))){
flat=true;
}
break;
default:
if(str2.get(0).equals(str1.get(0))
&&str2.get(1).equals(str1.get(1))
||str2.get(0).equals(str1.get(4))
&&str2.get(1).equals(str1.get(3))){
flat=true;
}
break;
}
break;
case "-":
flat=false;
switch (str2.get(3)) {
case "+":
if(str2.get(2).equals(str1.get(2))
&&str2.get(1).equals(str1.get(1))
||str2.get(1).equals(str1.get(3))
&&str2.get(2).equals(str1.get(4))){
flat=true;
}
break;
case "-":
if(str2.get(0).equals(str1.get(0))){
flat=true;
}
break;
case "/":
if(str2.get(0).equals(str1.get(0))
&&str2.get(2).equals(str1.get(2))
&&str2.get(1).equals(str1.get(1))){
flat=true;
}
break;
default:
if(str2.get(0).equals(str1.get(0))
&&str2.get(1).equals(str1.get(1))
||str2.get(0).equals(str1.get(4))
&&str2.get(1).equals(str1.get(3))){
flat=true;
}
break;
}
break;
case "/":
flat=false;
switch (str2.get(3)) {
case "*":
flat=true;
break;
case "/":
if(str2.get(4).equals(str1.get(4))
&&str2.get(3).equals(str1.get(3))
||str2.get(4).equals(str1.get(2))
&&str2.get(3).equals(str1.get(1))){
flat=true;
}
break;
case "+":
if(str2.get(4).equals(str1.get(4))
&&str2.get(3).equals(str1.get(3))
||str2.get(4).equals(str1.get(2))
&&str2.get(3).equals(str1.get(1))){
flat=true;
}
break;
default:
if(str2.get(3).equals(str1.get(3))
&&str2.get(4).equals(str1.get(4))){
flat=true;
}
break;
}
break;
default:
flat=false;
switch (str2.get(3)) {
case "*":
if(str2.get(2).equals(str1.get(2))
&&str2.get(1).equals(str1.get(1))
||str2.get(2).equals(str1.get(4))
&&str2.get(1).equals(str1.get(3))){
flat=true;
}
break;
case "/":
if(str2.get(0).equals(str1.get(0))){
flat=true;
}
break;
case "+":
if(str2.get(0).equals(str1.get(0))
&&str2.get(1).equals(str1.get(1))
&&str2.get(2).equals(str1.get(2))
||str2.get(0).equals(str1.get(2))
&&str2.get(1).equals(str1.get(3))
&&str2.get(2).equals(str1.get(4))){
flat=true;
}
break;
default:
if(str2.get(0).equals(str1.get(0))
&&str2.get(1).equals(str1.get(1))
&&str2.get(2).equals(str1.get(2))){
flat=true;
}
break;
}
break;
}
if(flat){
zhuzhifu=true;
}
}
}else{
break;
}
}
return flat;
}
}

2.优化后的  

package com.jm.sizeyunsuan;

import java.util.ArrayList;
import java.util.List; /**
* 查重的总函数
* @author admin
*
*/
public class CongFu {
/**
* 查重
*/
public boolean chacong(List<String> timus,String yunsuan){
boolean flat=false;//获取是否重复的标记
boolean zhuzhifu=false;//在flat为true的时候,终止本次循环的标志
for(String s:timus){
if(!zhuzhifu){
List<String> str=new ArrayList<String>();//获取已经存入在list中的题目
List<String> str2=new ArrayList<String>();//获取这次尝试的题目
for(int i=0;i<s.length();i++){
str.add(s.charAt(i)+"");
str2.add(yunsuan.charAt(i)+"");
}
flat= same(str, str2);//查看符号数字是不是一样
if(flat){
flat=diaoYong(str,str2);//判断查重
if(flat){
zhuzhifu=true;
}
}
}else{
break;
}
}
return flat;
} /**
* 为了减少代码块的过多抽取调用的方法
* @param str list中的题目
* @param str2 现在产生的题目
* @return
*/
public boolean diaoYong(List<String> str,List<String> str2 ){
CongFuAddAndJian aj=new CongFuAddAndJian();
CongFuChengAndChu cc=new CongFuChengAndChu();
boolean flat=false;
switch (str2.get(1)) {
case "+":
flat=aj.addcopy(str,str2);
break;
case "-":
flat=aj.jiancopy(str,str2);
break;
case "/":
flat=cc.chucopy(str,str2);
break;
default:
flat=cc.chengcopy(str,str2);
break;
}
return flat;
} /**
* 符号数字一样
* str1是题目
* str2是本次产生的题目
*/
public boolean same(List<String> str1,List<String> str2 ){
boolean flat=false;
for(int i=0;i<str1.size();i++){
if(!str1.contains(str2.get(i))
||!str2.contains(str1.get(i))){
break;
}else{
if(i==str1.size()-1){
flat=true;
}
}
}
return flat;
}
}

  

package com.jm.sizeyunsuan;

import java.util.List;

/**
* 判断重复的第一个符号为加减的
* @author
*
*/
public class CongFuAddAndJian { /**
* 第一个为加号判断重复
* ||之前为符号位置的一致,||之后的为符号位置不同
*/
public boolean addcopy(List<String> str1,List<String> str2){
boolean flat=false;
switch (str2.get(3)) {
case "+":
flat=true;
break;
case "-":
if(str2.get(4).equals(str1.get(4))
&&str2.get(3).equals(str1.get(3))
||str2.get(3).equals(str1.get(1))
&&str2.get(4).equals(str1.get(2))){
flat=true;
}
break;
case "/":
if(str2.get(2).equals(str1.get(2))
&&str2.get(3).equals(str1.get(3))
&&str2.get(4).equals(str1.get(4))
||str2.get(2).equals(str1.get(0))
&&str2.get(3).equals(str1.get(1))
&&str2.get(4).equals(str1.get(2))){
flat=true;
}
break;
default:
if(str2.get(0).equals(str1.get(0))
&&str2.get(1).equals(str1.get(1))
||str2.get(0).equals(str1.get(4))
&&str2.get(1).equals(str1.get(3))){
flat=true;
}
break;
}
return flat;
} /**
* 第一个为减号判断重复
* ||之前为符号位置的一致,||之后的为符号位置不同
*/
public boolean jiancopy(List<String> str1,List<String> str2){
boolean flat=false;
switch (str2.get(3)) {
case "+":
if(str2.get(2).equals(str1.get(2))
&&str2.get(1).equals(str1.get(1))
||str2.get(1).equals(str1.get(3))
&&str2.get(2).equals(str1.get(4))){
flat=true;
}
break;
case "-":
if(str2.get(0).equals(str1.get(0))){
flat=true;
}
break;
case "/":
if(str2.get(0).equals(str1.get(0))
&&str2.get(2).equals(str1.get(2))
&&str2.get(1).equals(str1.get(1))){
flat=true;
}
break;
default:
if(str2.get(0).equals(str1.get(0))
&&str2.get(1).equals(str1.get(1))
||str2.get(0).equals(str1.get(4))
&&str2.get(1).equals(str1.get(3))){
flat=true;
}
break;
}
return flat;
} }

  

package com.jm.sizeyunsuan;

import java.util.List;

/**
* 判断重复的第一个符号为乘除的
* @author
*
*/
public class CongFuChengAndChu {
/**
* 第一个为乘法判断重复
* ||之前为符号位置的一致,||之后的为符号位置不同
*/
public boolean chengcopy(List<String> str1,List<String> str2){
boolean flat=false;
switch (str2.get(3)) {
case "*":
flat=true;
break;
case "/":
if(str2.get(4).equals(str1.get(4))
&&str2.get(3).equals(str1.get(3))
||str2.get(4).equals(str1.get(2))
&&str2.get(3).equals(str1.get(1))){
flat=true;
}
break;
case "+":
if(str2.get(4).equals(str1.get(4))
&&str2.get(3).equals(str1.get(3))
||str2.get(4).equals(str1.get(2))
&&str2.get(3).equals(str1.get(1))){
flat=true;
}
break;
default:
if(str2.get(3).equals(str1.get(3))
&&str2.get(4).equals(str1.get(4))){
flat=true;
}
break;
}
return flat;
} /**
* 第一个为除法判断重复
* ||之前为符号位置的一致,||之后的为符号位置不同
*/
public boolean chucopy(List<String> str1,List<String> str2){
boolean flat=false;
switch (str2.get(3)) {
case "*":
if(str2.get(2).equals(str1.get(2))
&&str2.get(1).equals(str1.get(1))
||str2.get(2).equals(str1.get(4))
&&str2.get(1).equals(str1.get(3))){
flat=true;
}
break;
case "/":
if(str2.get(0).equals(str1.get(0))){
flat=true;
}
break;
case "+":
if(str2.get(0).equals(str1.get(0))
&&str2.get(1).equals(str1.get(1))
&&str2.get(2).equals(str1.get(2))
||str2.get(0).equals(str1.get(2))
&&str2.get(1).equals(str1.get(3))
&&str2.get(2).equals(str1.get(4))){
flat=true;
}
break;
default:
if(str2.get(0).equals(str1.get(0))
&&str2.get(1).equals(str1.get(1))
&&str2.get(2).equals(str1.get(2))){
flat=true;
}
break;
}
return flat;
} }

  

JProfiler的使用的更多相关文章

  1. 部署JProfiler监控tomcat

    下载JProfiler包 wget http://download-keycdn.ej-technologies.com/jprofiler/jprofiler_linux_9_2.rpm 安装JPr ...

  2. Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试

    本文是本人前一段时间做一个简单Java监控工具调研总结,主要包括VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,以及对Java微基准测试的简单介绍, ...

  3. 转载:JProfiler远程监控LINUX上的Tomcat过程细讲

    来源于xuwanbest的博客   所谓"工欲善其事,必先利其器",好的工具确能起到事半工倍的作用.我用到的最多的就两个JConsole 和JProfiler .JConsole监 ...

  4. JProfiler 8下载地址和注册码

    JProfiler---- 一个很好的java性能监控工具,现在附上下载地址和注册码,此破解版仅供学习交流使用, 其他用途请购买正版授权!!!windows x64 zip下载地址:http://do ...

  5. JProfiler

    1  前言 回答之前先让我们来看看什么是jProfiler:JProfiler是一个商业授权的Java剖析工具,由EJ技术有限公司,针对Java EE和Java SE应用程序开发的.它允许两个内存剖面 ...

  6. JProfiler学习笔记

    JProfiler学习笔记   一.安装JProfiler        从http://www.ej-technologies.com/下载5.1.2并申请试用序列号   二.主要功能简介 1.内存 ...

  7. jprofiler安装图解

    环境: 1.sun jdk1.6.0 2.jprofiler_windows_6_0_2.exe 安装 1. jdk, 安装略... 2. jprofiler安装 一路next 到Enter lice ...

  8. 循序渐进 Jprofiler

    一 Jprofiler 1 什么是Jprofiler JProfiler是一个全功能的Java剖析工具(profiler),专用于分析J2SE和J2EE应用程式.它把CPU.线程和内存的剖析组合在一个 ...

  9. JProfiler使用入门(一)——准备工作

      JProfiler是一个全功能的Java剖析工具(profiler),主要用于检查和跟踪系统(限于Java开发的)的性能. JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收 ...

  10. JProfiler使用详细教程学习笔记

    JProfiler学习笔记    推荐文章:JProfiler 入门教程 一.安装JProfiler        从http://www.ej-technologies.com/下载5.1.2并申请 ...

随机推荐

  1. Sublime Text3如何快速预览html文件

    Sublime Text3 步骤1:选择 Tools----> Build System ----> New Build System... 步骤2:输入以下内容 "cmd&qu ...

  2. 「SNOI2019」通信

    题目 还好我没生在陕西啊 首先发现这个题不能\(dp\),数据范围不大,好像一种网络流的样子啊 哎等等,这样向后面连边不是一个\(DAG\)吗,这不是最小权路径覆盖的板子吗 于是我们套路的拆点,对于一 ...

  3. 【转】Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

    转载地址:http://blog.csdn.net/ouyang_peng/article/details/51168072 Android 设备的CPU类型(通常称为”ABIs”) x86: 平板. ...

  4. 【转】escape,encodeURI,encodeURIComponent有什么区别?

    在这个页面里面试着搜了一下 「UTF-8」 ,居然没有搜到. escape 和 encodeURI 都属于 Percent-encoding,基本功能都是把 URI 非法字符转化成合法字符,转化后形式 ...

  5. 3150luogu洛谷

    若说代码 那真的是很水 但是 思想却有点意思 这道题是洛谷博弈论专题的第一道入门题, 然而刚开始我是不会做的, 毕竟是道入门题, 我博弈论还没入门呢. 这道题的做法就是: 如果m为偶数, 那么先手赢( ...

  6. Java并发(三)线程池原理

    Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 1. 降低资源消耗.通过重复利用已创建的线程降低线程 ...

  7. C# 语法一 构造函数

    1.构造函数的执行顺序 2.静态变量和成员变量的区别 代码示例: using System; using System.Collections.Generic; using System.Linq; ...

  8. Linux下NTP服务器配置

    简介 原理 配置ntp服务器 进行同步 一.简介 在计算时间的时候,最准确的计算应该是使用『原子震荡周期』所计算的物理时钟了( Atomic Clock, 也被称为原子钟 ),这也被定义为标准时间(I ...

  9. Vue2.x源码学习笔记-源码目录结构整理

    先从github上下载或者clone一个vue分支项目 https://github.com/vuejs/vue 查看下目录结果 先列出一些目录 Vue |— build 打包相关的配置文件,其中最重 ...

  10. git 用法---成功添加一个文件到github

    一.git 提交 全部文件 git add . git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件.注意 -A 选项后面还有一 ...