分类存档: Java

Android手机开发优化十大建议

优化基本要点:

  • 不要做不需要做的优化
  • 不要分配不必要的内存

1、避免创建不必要的对象,避免在循环中创建临时对象,从而减少gc。
2、错误的观点:如Map map = new  HashMap()与HashMap map = new HashMap(),实际小性能差距很小的
3、在类的内部避免使用getter和setter,因为直接取其fields会有缓存等效果,通过getter方法访问比直接通过调用属性值慢3倍
4、在常量中用 Static Final 来限定,
5、在循环中用加强的语法,就是指The enhanced for loop (就是指"for-each" loop)
6、用包机制来取代私有类的私有操作
7、谨慎地用用浮点数,float慢2倍于int
8、用熟知的lib及方法
9、谨慎地用本地方法jni
10、最后一点: 在优化之前,确认你有性能问题。要衡量你现在的性能情况,以及能带来的好处。

牢记以上规则,会让你在手机开发程序中取得更优的性能表现!

Spring学习笔记

1、ApplicationContext是BeanFactory的扩展
1)BeanFactory接口擅长于处理bean的初始化和配置,而ApplicationContext接口除了上述的工作化,还针对企业应用提供了许多基础支持,如事务处理和AOP
2)注入依赖(DI):通过构造方法的参数、工厂方法的参数,或给由构造函数或工厂方法创建对象设置属性。
3)IoC: Inversion of Control
4)depends-on: 当某些bean需要特定bean实例化后再进行实例化时,需要指定bean的id,多个以逗号分隔。
5)lazy-init: 当某些bean不希望在ApplicationContext初始化时就提前实例化时,只有当其被使用时才真正进行实例化。
6)Lookup方法注入,还有一些模糊,加强理解
(121页 2011-05-31)
继续阅读 »

JDK6-u18引发的重大问题

一、 现象:
服务器不老实,不断报警,JVM就这么不堪一击地挂了。
系统环境:Red Hat Enterprise Linux Server release 5.3 (Tikanga) 64位
JDK: JDK6-u18
二、日志截取

1、jboss_stdout.log
发现一大堆的broken pipe异常
2、mod_jk.log
也发现一堆的 继续阅读 »

Apache MINA 网络框架介绍

MINA 的基础架构

下图是 MINA 的架构图,

图 1:MINA 的架构图

在图中的模块链中,IoService 便是应用程序的入口,相当于我们前面代码中的 IoAccepter,IoAccepter 便是 IoService 的一个扩展接口。IoService 接口可以用来添加多个 IoFilter,这些 IoFilter 符合责任链模式并由 IoProcessor 线程负责调用。而 IoAccepter 在 ioService 接口的基础上还提供绑定某个通讯端口以及取消绑定的接口。在上面的例子中,我们是这样使用 IoAccepter 的:

继续阅读 »

深入Java垃圾回收_调优篇

      在Java中,通常通讯类型的服务器对GC(Garbage Collection)比较敏感。通常通讯服务器每秒需要处理大量进出的数据包,需要解析,分解成不同的业务逻辑对象并做相关的业务处理,这样会导致大量的临时对象被创建和回收。同时服务器如果需要同时保存用户状态的话,又会产生很多永久的对象,比如用户session。业务越复杂的应用往往用户 session包含的引用对象就越多。这样在极端情况下会发生两件事情,long gc pause time 或 out of memory。

继续阅读 »

深入Java垃圾回收机制_认识篇

     虽然各家 JVM 的实现(Sun Hotspot、IBM J9、Oracle JRockit 等)不同,但均采用了按代的垃圾收集机制。垃圾收集就是标识出虚拟机中不被用到的垃圾对象,删除以回收空间。按代垃圾收集算法主要分为三种:

     1、复制算法:空间被分为等大的两块,从根开始访问每一个关联的活跃对象,将空间 A 的活跃对象全部复制到空间 B,然后一次性回收整个空间 A,优点:只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,所以遍历空间的成本较小,缺点:需要巨大的复制成本和较多的内存;
     2、标记清除算法:从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理,优点:不需要额外的空间,缺点:较长的 GC 暂停时间,较大的扫描时间开销,产生较多的空间碎片;
     3、标记清除整理算法:综合上两种算法的优点,先标记活跃对象,然后将其合并成较大的内存块。
    代的划分:

继续阅读 »

快速排序_Java实现

算法的基本思想

快速排序的基本思想是基于分治策略的。对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分三步处理:

  • 分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。
  • 递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。
  • 合并(Merge):由于对分解出的两个子序列的排序是就地进行的,所以在L[p..q]和L[q+1..r]都排好序后不需要执行任何计算 L[p..r]就已排好序。

这个解决流程是符合分治法的基本步骤的。因此,快速排序法是分治法的经典应用实例之一。

继续阅读 »

【转】关注性能: 异常的异常

2004 年 2 月 13 日

Java 性能狂热者 Jack Shirazi 和 Kirk Pepperdine 分别是 JavaPerformanceTuning.com 的董事和首席技术官,他们从事全球 Internet 上的性能问题讨论,关注开发者遇到的困难。这个月在JavaRanchh 上的访谈,通过深入分析故事背后的故事,他们反驳了关于异常的营火会故事(译者注:即 campfire stories,是 JavaRanchh 推出的一个专栏,专门以童话故事的形式讲授 Java 技术)。

在这个专栏的 第一期,我们讨论了抛出异常的开销。这个月,我们换一个角度再来看这个主题 ―― JVM 如何处理所抛出的异常 ―― 并且我们要考虑,最理想的异常编码应该看成是早期的优化还是最优方法?

继续阅读 »

编程语言的选择并非无关紧要

     且说前一段时间听淘宝的黄裳讲解淘宝网站架构发展的时候,说起 2004 年底淘宝为何从 PHP 向 Java 转移的事情。为何转换,他阐述了几个理由,其中一个是非常有趣的:当时的 PHP 缺少一个 IDE。而合适的 IDE 能够有效提升规模化软件开发的效率。

我们知道 eBay 在 2002 年的时候也在 Sun 技术团队的帮助下,将整个应用架构从 C++ 迁移到 J2EE 。也就是 eBay 内部所说的 V3 版本(refer)。 继续阅读 »

逝去的SUN,永远的SUN

今天偶遇在网上看到这张图,第一反应是居然和我同岁

         SunRIP

 

继续阅读 »

利用HttpClient进行抓取网页内容

      以前一直用用HttpUrlConnection抓取网页内容,但发现考虑不周到的地方挺多。DIY的原则,同时也要遵循“不要重复发明轮子”,会偷懒的人才是真正聪明的人。:) 继续阅读 »

Java的内存监控及分析

   在生产环境中想有效地分析内存占用,同时又由于是生产环境不能随意加些测试工具等分析工具。在这种情况下,Java提供了一系列的工具便于我们用于检查我们的程序服务是否健康地运行。

  下面将介绍以下命令  

  • jinfo:可以输出并修改运行时的java 进程的opts。 
  • jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 
  • jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。 
  • jmap:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。 
  • jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。 
  •     接下来是对这些工具的详细介绍: 

    1、jstat

  •   从最简单的jstat工具开始:我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其id。jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。 
  •       使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 

  •   接下来是jstat,我之所以这次调优Liferay portal是因为,liferay在默认的情况下,并发用户一多就会产生 perm out of momery异常。虽然很开就解决了,但发现对VM内存使用量监控的重要性。通过google,很快的发现了jstat这个工具。 
  •       jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。 

  • jstat -class pid:显示加载class的数量,及所占空间等信息。 
  • jstat -compiler pid:显示VM实时编译的数量等信息。 
  • jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。 
  • jstat -gccapacity: 可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是 perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。 
  • jstat -gcnew pid:new对象的信息。 
  • jstat -gcnewcapacity pid:new对象的信息及其占用量。 
  • jstat -gcold pid:old对象的信息。 
  • jstat -gcoldcapacity pid:old对象的信息及其占用量。 
  • jstat -gcpermcapacity pid: perm对象的信息及其占用量。 
  • jstat -util pid:统计gc信息统计。 
  • jstat -printcompilation pid:当前VM执行的信息。 
  • 除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。  
  • 2、jmap

  • jmap 是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用 SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=String 3024可以将3024进程的内存heap输出出来到String文件里。  
  • 3、jinfo

  • jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo -opt pid 如:查看2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。 
  •  

    4、jconsole

  • jconsole是一个用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。由于是GUI程序,这里就不详细介绍了,不会的地方可以参考SUN的官方文档。 
  • 使用方法:命令行里打 jconsole,选则进程就可以了。 
  •  

  • 以下是这些工具的SUN官方说明: 
  • jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html
  • jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html
  • jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html
  • jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html
  • [转载]如何把Https网站中的安全证书导入到java中的cacerts证书库?

    在项目开发中,有时会遇到与SSL安全证书导入打交道的,如何把证书导入java中的cacerts证书库呢?
    其实很简单,方法如下:

    每一步:进入某个https://www.xxx.com开头的网站,把要导入的证书下载过来,

    在该网页上右键 >> 属性 >> 点击"证书" >>

    再点击上面的"详细信息"切换栏 >>

    再点击右下角那个"复制到文件"的按钮

    就会弹出一个证书导出的向导对话框,按提示一步一步完成就行了。

    例如:保存为abc.cer,放在C盘下

    继续阅读 »

    用HttpUrlConnection抓取网页内容

    由于项目需求,需要采集一些网站的内容。在JAVA领域中,已经存在很多良好的框架用于该应用,如httpclient,webharvest还有更多强大的框架。但由于本身项目比较单纯,且为了良好的自我控制,就决定直接用JDK中的HttpUrlConnection类来抓取网页内容。并不是说那些框架不好,而只是不适用本项目。

    说明:本博的一切内容均可转载,但必须注意出处。http://www.lelelog.com(乐乐日志)

    一、HttpUrlConnection连接之模拟浏览器

    在诸多的网站中,特别是大型的网站,设置了必须是浏览器的请求才会回应。之所以这样设置,就是为了防止我们这种项目给他产生无意义的请求(往往这种请求都是大批量,对其服务器产生负荷)。那为了解决这个问题,我们需要在http请求中,添加属性。

    HttpURLConnection urlConn;

    urlConn.setRequestProperty(“User-Agent”, “Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)”);

    这样就设置好了,你可以随意设置你的操作系统值,浏览器值,版本,只要正确就OK了。这样就可以正常有效地访问其网站了。他可不知道你是不是浏览器。你即使是条狗,他也不知道。

    继续阅读 »

    重构-改善既有代码的设计_读后感


    软件工程领域的超级经典巨著,与另一巨著《设计模式》并称”软工双雄”,全美销量超过100000册,亚马逊书店五星书。
    在本书中,作者Martin Fowler充分展示了何处可能需要重构,以及如何将不好的设计改造为良好的设计。
    当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,与这些沿袭下来的、质量不佳的程序共处,是多么艰难。对象专家运用许多技术来改善既有程序的结构完美性与性能,已有数年之久。
    继续阅读 »