关于java性能的小笔记

 

一、大规模高并发访问的性能分析:

1.应用服务器中JVM的优化:

在安装JDK后,有两个JVM虚拟机,分别是server jvm和 client jvm。其中server jvm比client jvm进行了更多的优化,所以在开发和测试Web应用系统时,应用指定服务器的jvm虚拟机为server jvm。

       启动client jvm 和server jvm的方式:

       Java –client yourclass

       Java –server yourclass

       其中client jvm是默认的启动方式。在tomcat服务器中,通常会有如下两种设置jvm虚拟机的方式:

●   %java_home%/jre/bin/client/jvm.dll

●   %java_home%/jre/bin/server/jvm.dll

Jvm动态库有client和server两个版本,分别针对桌面应用和服务器应用做了相应优化,其中client版本加载速度较快,server版本加载速度较慢但运行起来较快。一般在tomcat服务器中,应使用server版本。

 

2.  JVM虚拟机中对字节码优化的策略:

Server jvm和client jvm对字节码优化的策略不同:

●Client主要优化对用户交互的相应速度。

●Server主要优化后台运行的代码。

使用server模式可以提高性能,启动比client模式慢,长期运行则比client模式快。当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以server模式启动,否则以client模式启动。J2SE 5.0检测的根据是至少2个CPU和最低2GB内存。

3.  堆大小设置:

JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32bit还是64bit)限制;系统的可用物理内存限制。在32位系统下,一般限制在1.5-2G,在64位系统下,操作系统对内存无限制。

常用的典型设置如下:

●Java –Xmx3550m –Xms3550m –Xmn2g –Xss128k

●-Xmx3550m: 设置JVM最大可用内存为3550。

 

-Xms3550m:设置JVM初始化内存为3550M。此值可以设置于-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小+年老代大小+持久代大小。持久代大小一般固定大小为64M,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的3/8。基于对对象生命周期分析后得出的垃圾回收算法,把对象分为年轻代,年老代,持久代,对不同的生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE 1.2开始)都是使用此算法的。

-Xss128k:设置每个线程的堆栈大小。从JDK5.0每个堆线程大小为1M,以前每个线程堆大小为256K。可根据具体应用调整线程所需内存大小。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,通常值在3000~5000左右。

4.回收器选择:

       在JVM中给三种回收器的选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,在JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数,从JDK5.0以后,JVM会根据当前系统配置进行判断。

       并行收集器主要以达到一定的吞吐量为目标,适用于科学技术和后台处理等,典型配置如下:

java-Xmx2800m-Xms800m-Xmn2g-Xss128k-XX:+UserParallelGC-XX:ParallelGCThreads=20-XX:+UserParallelOldGC

    ●-XX:+UserParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。

       ●-XX:ParallelGCThreads=20:配置并行收集器的线程数,即同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

       ●-XX:+UserParallelOldGC:配置年老代垃圾收集方式为并行收集,JDK6.0支持对年老代并行收集。

       并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。典型配置如下:

Java-Xmx3550m-Xms3550-Xmn2g-Xss128k-XX:ParallelGCThreads=20-XX:+UserConcMarkSweepGC-XX:+UserParNewGC

       ●-XX:+UseConcMarkSweepGC:设置年老代为并发收集。

       ●-XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。从JDK5.0开始,JVM会根据系统配置自行设置,所以无需再设置此值。

5.年轻代大小选择:
       响应时间优先的应用:年轻代尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时减少到达年老代对象。

吞吐量优先的应用:年期代尽可能的设置大,可能达到Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

6.年老代大小选择:

       响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可能会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式:如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:

●    并发垃圾收集信息。

●    持久代并发收集次数

●    传统GC信息

●    花在年轻代和年老代回收上的时间比例

●    减少年轻代和年老代花费的时间,一般会提高应用的效率

吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是:这样可以尽可能回收掉大部分短期对象,减少中期的对象。

 

7.较小堆引起的碎片分析:

       因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,它会把相邻的空间进行合并,这样可以分配给较大的对象。但是当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:

       ●-XX:+UserCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。

       ●-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩。

8.在实际编程中对内存的优化:

       应用java开发的系统给人的印象是占内存,其实从理论上来讲,java开发的系统并不比其他语言开发的系统更占用内存,这就需要子啊编程时注意优化内存。

       ●不要使用new Boolean().

       ●不要使用new Integer()

    ●用StringBuffer代替字符串相加

    ●过滥使用哈希表

    ●避免过深的类层次结构和过深的方法调用。因为这两者都是非常占用内存的(特别是方法调用更是堆栈空间的消耗大户)

    ●变量只用在用到它的时候才定义和实例化

    ●尽量避免使用static变量,类内私有常量可以有final来代替

    ●尽早释放无用对象的引用

    ●尽量少用finalize函数。它会增加GC的工作量

    ●尽量避免在类的默认构造器中创建和初始化大量的对象,防止在调用其构造器时造成不必要的内存资源浪费

    ●尽量避免强制显示申请数组空间

    ●尽量做远程方法调用类应用开发时使用瞬间值变量,除非远程调用端需要获取该瞬间值变量的值。

    ●尽量在合适的场景下使用对象池技术以提高系统性能

9.集群与负载均衡

    在单一的服务器上执行某些应用程序会出现一些重大问题。当网站成功建成并开始接受大量请求时,单一服务器终究无法满足需要处理的负荷量,所以就显得有点力不从心了。另外一个常见的问题是会产生单点故障,如果该服务器坏掉,那么网站就立刻无法运行了。不论是因为要有较佳的扩充性还是要有容错能力。都希望在一台以上的服务器计算机上执行该应用程序,这就需要用到集群技术。

    集群(luster)一组独立的计算机系统构成一个松耦合的多处理系统,他们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。

    集群系统主要解决下面几个问题:

●    高可靠性(HA):利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。

●    高性能计算(HP):即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域,如基因分析,化学分析。

●    负载平衡:即把负载压力根据某种算法合理分配到集群中每一台计算机上,以减轻服务器压力,降低对主服务器的硬件和软件需求。

●    负载均衡(oad Balance):集群就是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同硬件构成的计算机。如一个提供Web服务的集群,从外界来看是一个大的WEB服务器。不过集群的节点也可以单独提供服务。在现有网络结构之上,负载均衡提供了一种廉价有效的方法扩展服务器带宽和增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。

目前比较常用的负载均衡技术主要如下:

1.基于DNS的负载均衡

a)        通过DNS服务中的随机名字来实现负载均衡,在DNS服务器中,可以为多个不同的地址配置同一个名字,而最终查询这个名字的客户机讲在解析这个名字时得到其中一个地址,因此,对于同一个名字,不同的客户机会得到不同的地址,他们也就访问不同地址上的WEB应用服务器,从而达到负载均衡的目的。

反向代理负载均衡

时间: 2024-08-20 12:10:15

关于java性能的小笔记的相关文章

Android应用开发提高系列(2)——《Practical Java 中文版》读书笔记(下)

声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com   系列 Android应用开发提高系列(1)--<Practical Java 中文版>读书笔记(上)    正文  注意:条目和用语可能与书籍有所出入,但尽量保持原样加一些自己的理解. 一.性能 1. 先把焦点放在设计.数据结构和算法身上 备注:良好的设计.明智的选择数据结构和算法可能比高效代码更重要.   2.  不要依赖编译

(代码级)Java性能的优化

性能|优化 Java在九十年代中期出现以后,在赢得赞叹的同时,也引来了一些批评.赢得的赞叹主要是Java的跨平台的操作性,即所谓的"Write Once,Run Anywhere".但由于Java的性能和运行效率同C相比,仍然有很大的差距,从而引来了很多的批评. 对于服务器端的应用程序,由于不大涉及到界面设计和程序的频繁重启,Java的性能问题看似不大明显,从而一些Java的技术,如JSP,Se rvlet,EJB等在服务器端编程方面得到了很大的应用,但实际上,Java的性能问题在服务

Java 性能优化之 String 篇

String 在 JVM 的存储结构 一般而言,Java 对象在虚拟机的结构如下: 对象头(object header):8 个字节 Java 原始类型数据:如 int, float, char 等类型的数据,各类型数据占内存如 表 1. Java 各数据类型所占内存. 引用(reference):4 个字节 填充符(padding) 表 1. Java 各数据类型所占内存 然而,一个 Java 对象实际还会占用些额外的空间,如:对象的 class 信息.ID.在虚拟机中的状态.在 Oracle

关于Java性能的9个谬论

Java的性能有某种黑魔法之称.部分原因在于Java平台非常复杂,很多情况下问题难以定位.然而在历史上还有一种趋 势,人们靠智慧和经验来研究Java性能,而不是靠应用统计和实证推理.在这篇文章中,我希望拆穿一些最荒谬的技术神话 . 1.Java很慢 关于Java的性能有很多谬论,这一条是最过时的,可能也是最为明显的. 确实,在上 世纪90年代和本世纪初处,Java有时是很慢. 然而从那以后,虚拟机和JIT技术已经有了十多年的改进,Java的整体 性能现在已经非常好了. 在6个独立的Web性能基准

Java性能优化[1]:基本类型 vs 引用类型

在Java性能优化系列中,内存管理是一个要优先考虑的关键因素.而说到内存分配,就必然会涉及到 基本类型和引用类型.所以我们今天就先来介绍一下这两种类型在性能方面各自有什么奥妙(关于这两 种类型在其它方面的奥妙,我会另外写一个帖子). ★名词定义 先明确一下什么是基本类型,什么是引用类型.简单地说,所谓基本类型就是Java语言中如下的8种 内置类型:boolean.char.byte.short.int.long.float.double.而引用类型就是那些可以通过 new来创建对象的类型(基本上

5招教你把握Java性能监控(转自51testing)

很多开发者觉得自己懂Java编程,事实是大多数开发人员都只领会到了Java平台的皮毛,所学也只够应付工作.作者将深度挖掘Java平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程困难. 当应用程序性能受到损害时,大多数开发人员都惊慌失措,这在情理之中.跟踪Java应用程序瓶颈来源一直以来都是很麻烦的,因为Java虚拟机有黑盒效应,而且Java平台分析工具一贯就有缺陷. 然而,随着Java5中JConsole的引入,一切都发生了改变.JConsole是一个内置Java性能分析器,可以从

Java中jqGrid 学习笔记整理——进阶篇(二)_java

相关阅读: Java中jqGrid 学习笔记整理--进阶篇(一) 本篇开始正式与后台(java语言)进行数据交互,使用的平台为 JDK:java 1.8.0_71 myEclisp 2015 Stable 2.0 Apache Tomcat-8.0.30 Mysql 5.7 Navicat for mysql 11.2.5(mysql数据库管理工具) 一.数据库部分 1.创建数据库 使用Navicat for mysql创建数据库(使用其他工具或直接使用命令行暂不介绍) 2. 2.创建表 双击打

Java性能最后一个领域:去除垃圾回收器

来自RedHat的性能和OpenJDK开发者Aleksey Shipil v,提交了一份新的JEP草案,其内容为创建一个无操作垃圾回收器:一种实际上不进行实际内存回收的GC方式.该回收器旨在帮助JVM实现者和研究者,以及少部分无需垃圾回收的超高性能应用程序.如果这项JEP继续推进,新的GC方式将会和现有GC方式一起存在,并且通过显式激活方式使用. 垃圾回收和Java性能向来都是复杂的话题,为了能够更清晰的说明,InfoQ联系了Java Champions成员.性能专家Martijn Verbur

Java 程序性能优化《第一章》Java性能调优概述 1.1性能概述

Java 程序性能调优<第一章>Java性能调优概述(1.1性能概述) 1.1 性能概述 为什么程序总是那么慢?它现在到底在干什么?时间都花在哪里了?也许,你经常会抱怨这些问题,如果是这样,那说明你的程序出了性能问题.和功能问题相比,性能问题在有些情况下,可能不算什么大问题,将就将就,也就过去了.但是严重的性能问题会导致程序瘫痪.假死.直至崩溃.本书就先来认识性能的各种表现和指标. 1.1.1 看懂程序的性能 对客户端程序而言,拙劣的性能会严重影响用户体验,界面停顿.抖动.响应迟钝等问题会遭到