java后端server逻辑处理比较多,响应时间超过二十秒了,怎么进行优化

java后端server逻辑处理比较多,响应时间超过二十秒了,怎么进行优化,第1张

不要用VJ++,不好。

刚开始用纯jdk,过一般时间用EditPlus等这样的工具,以后推荐使用Eclipse,因为是开源,也就是免费的。

JDK

Borland 的JBuilder

JBuilder,JDeveloper,VisualAge for Java

jcreater

常见的十五种Java开发工具的特点

1、JDK (Java Development Kit)Java开发工具集

从初学者角度来看,采用JDK开发Java程序能够很快理解程序中各部分代码之间的关系,

有利于理解Java面向对象的设计思想。JDK的另一个显著特点是随着Java (J2EE、J2SE

以及J2ME)版本的升级而升级。但它的缺点也是非常明显的就是从事大规模企业级Java

应用开发非常困难,不能进行复杂的Java软件开发,也不利于团体协同开发。

2、Java Workshop

3、NetBeans 与Sun Java Studio 5

NetBeans是开放源码的Java集成开发环境(IDE),适用于各种客户机和Web应用。

Sun Java Studio是Sun公司最新发布的商用全功能Java IDE,支持Solaris、Linux和Win

dows平台,适于创建和部署2层Java Web应用和n层J2EE应用的企业开发人员使用。

NetBeans是业界第一款支持创新型Java开发的开放源码IDE。开发人员可以利用业界

强大的开发工具来构建桌面、Web或移动应用。同时,通过NetBeans和开放的API的模块

化结构,第三方能够非常轻松地扩展或集成NetBeans平台。

NetBeans351主要针对一般Java软件的开发者,而Java One Studio5则主要针对企

业做网络服务等应用的开发者。Sun不久还将推出Project Rave,其目标是帮助企业的开

发者进行软件开发。NetBeans 351版本与其他开发工具相比,最大区别在于不仅能够

开发各种台式机上的应用,而且可以用来开发网络服务方面的应用,可以开发基于J2ME

的移动设备上的应用等。在NetBeans 351基础上,Sun开发出了Java

One Studio5,为用户提供了一个更加先进的企业编程环境。在新的Java

One Studio5里有一个应用框架,开发者可以利用这些模块快速开发自己在网络服务方面

的各种应用程序。

 当CPU 进入多核时代之后 软件的性能调优就不再是一件简单的事情 没有并行化的程序在新的硬件上可能会运行得比从前更慢 当 CPU 数目增加的时候 芯片制造商为了取得最佳的性能/功耗比 降低 CPU 的运行频率是一件非常明智的事情 相比 C/C++ 程序员而言 利用 Java 编写多线程应用已经简单了很多 然而 多线程程序想要达到高性能仍然不是一件容易的事情 对于软件开发人员而言 如果在测试时发现并行程序并不比串行程序快 那不是一件值得惊讶的事情 毕竟 在多核时代之前 受到广泛认可的并行软件开发准则通常过于简单和武断

 在本文中 我们将介绍使提高Java 多线程应用性能的一般步骤 通过运用本文提供的一些简单规则 我们就能获得具有高性能的可扩展的应用程序

  为什么性能没有增长?

 多核能带来性能的大幅增长 这很容易通过简单的一些测试来观察到 如果我们写一个多线程程序 并在每个线程中对一个本地变量进行累加 我们可以很容易的看到多核和并行带来的成倍的性能提升 这非常容易做到 不是吗?在 参考资源 里我们给出了一个例子 然而 与我们的测试相反 我们很少在实际软件应用中看到这样完美的可扩展性 阻碍我们获得完美的可扩展性有两方面的因素存在 首先 我们面临着理论上的限制 其次软件开发过程中也经常出现实现上的问题 让我们看看 图 中的三条性能曲线

  图 性能曲线

 

 作为追求完美的软件工程师 我们希望看到随着线程数目的增长程序的性能获得线性的增长 也就是图 中的蓝色直线 而我们最不希望看到的是绿色的曲线 不管投入多少新的 CPU 性能也没有丝毫增长 (随着 CPU 增长而性能下降的曲线在实际项目中也存在) 而图中的红色线条则说明通常的 法则并不适用于可扩展性方面 假设程序中有 % 的计算只能串行进行 那么其扩展性曲线如红线所示 由图可见 当 % 的代码可以完美的并行时 在 个 CPU 存在的情况下 我们也只能获得大约 倍的性能 如果任务中具有无法并行的部分 那么在现实世界 我们的性能曲线大致上会位于图 中的灰 域

 在这篇文章中 我们不会试图挑战理论极限 我们希望能解释一个 Java 程序员如何能够尽可能的接近极限 这已经不是一个容易的任务

  是什么造成了糟糕的可扩展性?

 可扩展性糟糕的原因有很多 其中最为显著的是锁的滥用 这没有办法 我们就是这样被教育的 想要多线程安全吗?那就加一个锁吧 想想 Python 中臭名昭著的 Global Intepreter Lock 还有 Java 中的 Collections synchronizedXXXX() 系列方法 跟随巨人的做法有什么不好吗?是的 用锁来保护关键区域非常方便 也较容易保证正确性 然而锁也意味着只有一个进程能进入关键区域 而其他的进程都在等待!如果观察到 CPU 空闲而软件执行缓慢 那么检察一下锁的使用是一个明智的做法

 对于 Java 程序而言 Performance Inspector 中的 Java Lock Monitor 是一个不错的开源工具

 [NextPage]

  对一个多线程应用进行调优

 下面 我们将提供一个例子程序并演示如何在多核平台上获得更好的可扩展性 这个例子程序演示了一个假想的日志服务器 它接收来自多个源的日志信息并将其统一保存到文件系统中 为了简单起见 我们的例子代码中不包含任何的网络相关代码 Main() 函数将启动多个线程来发送日志信息到日志服务器中 对于性急的读者 让我们先看看调优的结果

  图 日至服务器调优结果

 

 在上图中 蓝色的曲线是一个基于 Lock 的老式日志服务器 而绿色的曲线是我们进行了性能调优之后的日志服务器 可以看到 LogServerBad 的性能随线程数目的增加变化很小 而 LogServerGood 的性能则随着线程数目的增加而线性增长 如果不介意使用第三方的库的话 那么来自 Project KunMing 的 LockFreeQueue 可以进一步提供更好的可扩展性

  图 使用 Lock free 的数据结构

 

 在上图中 第三条曲线表示用 LockFreeQueue 替换标准库中的 ConcurrentLinkedQueue 之后的性能曲线 可以看到 如果线程数目较少时 两条曲线差别不大 但是单线程数目增大到一定程度之后 Lock Free 的数据结构具有明显的优势

 在下文中 将介绍在上述例子中使用的可以帮助我们创建高可扩展 Java 应用的工具和技巧

 [NextPage]

  使用 JLM 分析应用程序

 JLM 提供了 Java 应用和 JVM 中锁持有时间和冲突统计 具体提供以下功能

 对冲突的锁进行计数

 成功获得锁的次数

 递归锁的次数

 申请锁的线程被阻塞等待的次数

 锁被持有的累计时间 对于支持 Tier Spin Locking 的平台 还可以获得以下信息 :

 请求线程在内层(spin loop)请求锁的次数

 请求线程在外层(thread yield loop)请求锁的次数

 使用 rtdriver 工具收集更详细的信息

 jlmlitestart 仅收集计数器

 jlmstart 仅收集计数器和持有时间统计

 jlmstop 停止数据收集

 jlmdump 打印数据收集并继续收集过程

 从锁持有时间中去除垃圾收集(Garbage Collection GC)的时间

 GC 时间从 GC 周期中所有被持有的锁的持有时间中去除

  使用 AtomicInteger 进行计数

 通常 在我们实现多线程使用的计数器或随机数生成器时 会使用锁来保护共享变量 这样做的弊端是如果锁竞争的太厉害 会损害吞吐量 因为竞争的同步非常昂贵

 volatile 变量虽然可以使用比同步更低的成本存储共享变量 但它只可以保证其他线程能够立即看到对 volatile 变量的写入 无法保证读 修改 写的原子性 因此 volatile 变量无法用来实现正确的计数器和随机数生成器

 从 JDK 开始 ncurrent atomic 包中引入了原子变量 包括 AtomicInteger AtomicLong AtomicBoolean 以及数组 AtomicIntergerArray AtomicLongArray 原子变量保证了 ++ —— += = 等操作的原子性 利用这些数据结构 您可以实现更高效的计数器和随机数生成器

  加入轻量级的线程池—— Executor

 大多数并发应用程序是以执行任务(task)为基本单位进行管理的 通常情况下 我们会为每个任务单独创建一个线程来执行 这样会带来两个问题 一 大量的线程(> )会消耗系统资源 使线程调度的开销变大 引起性能下降 二 对于生命周期短暂的任务 频繁地创建和消亡线程并不是明智的选择 因为创建和消亡线程的开销可能会大于使用多线程带来的性能好处

 一种更加合理的使用多线程的方法是使用线程池(Thread Pool) ncurrent 提供了一个灵活的线程池实现 Executor 框架 这个框架可以用于异步任务执行 而且支持很多不同类型的任务执行策略 它还为任务提交和任务执行之间的解耦提供了标准的方法 为使用 Runnable 描述任务提供了通用的方式 Executor 的实现还提供了对生命周期的支持和 hook 函数 可以添加如统计收集 应用程序管理机制和监视器等扩展

 在线程池中执行任务线程 可以重用已存在的线程 免除创建新的线程 这样可以在处理多个任务时减少线程创建 消亡的开销 同时 在任务到达时 工作线程通常已经存在 用于创建线程的等待时间不会延迟任务的执行 因此提高了响应性 通过适当的调整线程池的大小 在得到足够多的线程以保持处理器忙碌的同时 还可以防止过多的线程相互竞争资源 导致应用程序在线程管理上耗费过多的资源

 Executor 默认提供了一些有用的预设线程池 可以通过调用 Executors 的静态工厂方法来创建

newFixedThreadPool 提供一个具有最大线程个数限制的线程池 newCachedThreadPool 提供一个没有最大线程个数限制的线程池 newSingleThreadExecutor 提供一个单线程的线程池 保证任务按照任务队列说规定的顺序(FIFO LIFO 优先级)执行 newScheduledThreadPool 提供一个具有最大线程个数限制线程池 并支持定时以及周期性的任务执行

  使用并发数据结构

 Collection 框架曾为 Java 程序员带来了很多方便 但在多核时代 Collection 框架变得有些不大适应 多线程之间的共享数据总是存放在数据结构之中 如 Map Stack Queue List Set 等 Collection 框架中的这些数据结构在默认情况下并不是多线程安全的 也就是说这些数据结构并不能安全地被多个线程同时访问 JDK 通过提供 SynchronizedCollection 为这些类提供一层线程安全的接口 它是用 synchronized 关键字实现的 相当于为整个数据结构加上一把全局锁保证线程安全

 ncurrent 中提供了更加高效 collection 如 ConcurrentHashMap/Set ConcurrentLinkedQueue ConcurrentSkipListMap/Set CopyOnWriteArrayList/Set 这些数据结构是为多线程并发访问而设计的 使用了细粒度的锁和新的 Lock free 算法 除了在多线程条件下具有更高的性能 还提供了如 put if absent 这样适合并发应用的原子函数

 [NextPage]

  其他一些需要考虑的因素

  不要给内存系统太大的压力

 如果线程执行过程中需要分配内存 这在 Java 中通常不会造成问题 现代的 JVM 是高度优化的 它通常为每个线程保留一块 Buffer 这样在分配内存时 只要 buffer 没有用光 那么就不需要和全局的堆打交道 而本地 buffer 分配完毕之后 JVM 将不得不到全局堆中分配内存 这样通常会带来严重的可扩展性的降低 另外 给 GC 带来的压力也会进一步降低程序的可扩展性 尽管我们有并行的 GC 但其可扩展性通常并不理想 如果一个循环执行的程序在每次执行中都需要分配临时对象 那么我们可以考虑利用 ThreadLocal 和 SoftReference 这样的技术来减少内存的分配

  使用 ThreadLocal

 ThreadLocal 类能够被用来保存线程私有的状态信息 对于某些应用非常方便 通常来讲 它对可扩展性有正面的影响 它能为各个线程提供一个线程私有的变量 因而多个线程之间无须同步 需要注意的是在 JDK 之前 ThreadLocal 有着相当低效的实现 如果需要在 JDK 或更老的版本上使用 ThreadLocal 需要慎重评估其对性能的影响 类似的 目前 JDK 中的 ReentrantReadWriteLock 的实现也相当低效 如果想利用读锁之间不互斥的特性来提高可扩展性 同样需要进行 profile 来确认其适用程度

  锁的粒度很重要

 粗粒度的全局锁在保证线程安全的同时 也会损害应用的性能 仔细考虑锁的粒度在构建高可扩展 Java 应用时非常重要 当 CPU 个数和线程数较少时 全局锁并不会引起激烈的竞争 因此获得一个锁的代价很小(JVM 对这种情况进行了优化) 随着 CPU 个数和线程数增多 对全局锁的竞争越来越激烈 除了一个获得锁的 CPU 可以继续工作外 其他试图获得该锁的 CPU 都只能闲置等待 导致整个系统的 CPU 利用率过低 系统性能不能得到充分利用 当我们遇到一个竞争激烈的全局锁时 可以尝试将锁划分为多个细粒度锁 每一个细粒度锁保护一部分共享资源 通过减小锁的粒度 可以降低该锁的竞争程度 ncurrent ConcurrentHashMap 就通过使用细粒度锁 提高 HashMap 在多线程应用中的性能 在 ConcurrentHashMap 中 默认构造函数使用 个锁保护整个 Hash Map 用户可以通过参数设定使用上千个锁 这样相当于将整个 Hash Map 划分为上千个碎片 每个碎片使用一个锁进行保护

  结论

 通过选择一种合适的 profile 工具 检查 profile 结果中的热点区域 使用适合多线程访问的数据结构 线程池 细粒度锁减小热点区域 并重复此过程不断提高应用的可扩展性

lishixinzhi/Article/program/Java/gj/201311/27639

一、JConsole是什么

    从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。

二、如何启动JConsole

如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole 即可。

如果从 GUI shell 启动,找到 JDK 安装路径,打开 bin 文件夹,双击 jconsole 。

    当分析工具弹出时(取决于正在运行的 Java 版本以及正在运行的 Java 程序数量),可能会出现一个对话框,要求输入一个进程的 URL 来连接,也可能列出许多不同的本地 Java 进程(有时包含 JConsole 进程本身)来连接。如图所示:

想分析那个程序就双击那个进程。

三、如何设置JAVA程序运行时可以被JConsolse连接分析

本地程序(相对于开启JConsole的计算机),无需设置任何参数就可以被本地开启的JConsole连接(Java SE 6开始无需设置,之前还是需要设置运行时参数 -Dcomsunmanagementjmxremote )

无认证连接 (下面的设置表示:连接的端口为8999、无需认证就可以被连接)

-Dcomsunmanagementjmxremoteport=8999 \  

-Dcomsunmanagementjmxremoteauthenticate=false \  

-Dcomsunmanagementjmxremotessl=false  

四、JConsole如何连接远程机器的JAVA程序(举例说明)

1、写一个简单的一直运行的JAVA程序,运行在某台机器上如(1921680181)

java -cp -Dcomsunmanagementjmxremoteport=8999 -Dcomsunmanagentjmxremoteauthenticate=false -Dcomsunmanagementjmxremotessl=false JConsoleTest  

2、另外一台机器进行连接

可以直接使用命令:

jconsoleexe 1921680181:8999  

 也可以在已经打开的JConsole界面操作 连接->新建连接->选择远程进程->输入远程主机IP和端口号->点击“连接。

Java 高性能模式主要包括以下几个方面:

1 JVM 参数优化:通过设置 JVM 参数来优化垃圾回收、线程池、类加载等方面的性能。

2 代码优化:优化代码结构和算法,减少 CPU、内存、I/O 等资源的浪费,提高代码执行效率。

3 数据库优化:针对数据库的索引、缓存、连接池等进行调优,提高数据库查询和操作的性能。

4 分布式优化:在分布式系统中,优化网络通信、负载均衡、服务治理等方面,提高系统吞吐量和性能。

具体的开启方式如下:

1 JVM 参数优化:

使用 jstat 命令来查看 JVM 相关参数,然后通过 -Xms、-Xmx、-XX:NewRatio、-XX:MaxPermSize 等参数来优化 JVM 内存管理。

使用 -XX:+UseConcMarkSweepGC、-XX:+UseParallelGC 等参数来优化垃圾回收。

使用 -XX:+UseThreadPriorities、-XX:ParallelGCThreads 等参数来优化线程池。

使用 -XX:+UseCompressedOops、-XX:+AggressiveOpts 等参数来优化类加载和执行效率。

2 代码优化:

优化算法:优化算法可以有效地提高代码执行效率,例如使用快速排序代替插入排序。

避免重复计算:重复计算会导致 CPU 和内存资源浪费,因此需要使用缓存或者避免重复计算。

使用字节码增强技术:字节码增强技术可以通过在运行时修改字节码来优化代码执行效率。

3 数据库优化:

创建索引:索引可以加速数据库的查询操作,提高查询效率。

使用缓存:使用缓存来减少数据库的访问次数,提高查询效率。

调整连接池:调整连接池的大小和空闲时间等参数,以最大限度地利用数据库连接资源。

4 分布式优化:

使用负载均衡器:使用负载均衡器将请求均匀地分配到不同的服务器上,从而减轻单个服务器的负载。

使用异步通信:使用异步通信可以减少网络通信的开销,提高系统吞吐量。

使用缓存:使用缓存可以减少网络通信的开销,提高数据访问效率。

以上就是 Java 高性能模式的开启方式,需要根据具体场景进行调整和优化。

关于性能调优:

1 需要一个性能探测器,找到调用最频繁的代码段,优化这部分代码(优化算法)

2 往往1%的代码运行时间占99%。所以优化这些代码就能事半功倍。

3 最好是能看懂编译后的代码,这样分析最彻底。

Java的性能分析使用JProfiler

堆栈分析使用的Jstack

Java性能调优 SSH框架优化以适应特定的项目

一、JVM调优

1 各种垃圾回收算法及其优劣;

2 针对不同应用类型如何选择JVM参数

3 常用调优工具的使用(jps/jstat/jmap/jstack/jinfo/jhat)

4 调优案例分析(如何选择不同内存块的大小,如何选择不同的算法来提升性能、响应时间)

二、Java应用中CPU占用率、使用情况分析,线程死锁等锁

系统性能瓶颈的分析定位

1 JStack的深度使用

2 各种Linux监控命令的配合使用(top,vmstat,iostat,sar 不要轻信自己能完全掌控这些命令)、分析

(前一阵Java漏洞通过制造Hash冲突来占尽CPU资源就可以通过top命令快速定位到,你肯定没有这么用过)

3 JProfiler的详细使用

三、Java内存溢出分析

1 用EMA来分析内存占用情况

2 通过案例分析来定位内存泄漏

互联网中的性能主要是两个方面:

1 吞吐量,就是系统支持的访问量。

2 延迟,就是一个请求提交后,相应的时间。

一般硬件不变的情况下,两方面各自优化到极限后,相互会制约,也就是吞吐量增强的话比如需要延迟加大,反之亦然。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » java后端server逻辑处理比较多,响应时间超过二十秒了,怎么进行优化

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情