java优化更

以前面试的时候,总被面试官问及性能调优的问题,今天按我的理解总结一下。

性能调优牵扯的地方很多,具体要根据实际项目应用入手,大体上分下面几个方向:

  • 硬件  硬件扩容,投入很多
  • 软件    
  1. java
    java调优一般是指参数调优,代码方面尽量用工厂模式,特别对于一些大的对象,gc回收会很耗时间,这点effective  java里讲了很多。多使用jdk自带的工具类,多线程方面可以考虑util下面的concurrent集合包。GC回收一般是回收堆里的数据,堆分 new区,old区,静态方法区,对于频繁生成对象的项目可以把new区设置的大一些,对对象变化不大,设置old区大一些。垃圾回收方式分串行,并行, 并发,要根据项目紧急程序选择。最后还要分析gc回收日志,可以利用jdk自带的工具,像jstack.jmap,jconsole等,还可以使用 jprofiler,这个很强大,不过是收费的。

 

    2.   中间件

          多使用中间件提供的特性 如:安全机制,事物机制,消息机制等,中间件对分布式提供了很好的支持,通过中间件配置线程池以及数据库连接池,由容器来管理实例,可以减少开启以及关闭的开销。

 

    3.   数据库

  大表尽量少关联,提前对表analysis,分表分区,大表要建索引,查询数据尽量走索引,减少full table 的查询,对于必须要进行的大表关联,可以提前一天生成view 。定期对索引重建

 

架构方面一般是:

  DNS IP段分发:有效的分发请求。

  LP:软件负载通过现有的工具取余或者轮询等,硬件F5负载,听说新浪是通过这个实现的。

  动静分离:配合apache静态文件搞笑支持,可以让中间件更好的的处理动态内容。

  读写分离:配合缓存能加大关键字命中率 。

  水平分库:表数据过多可以根据关键字分区。

  垂直分库:有些数据不是很长用,但是占用的字节又很多,可以分割一下,等使用的时候再关联,这样可以减少查询时间,看过robbin的文章,iteye也经历过这个过程。

 分布式存储:业务分离,跨平台,更好的利用外部资源。

 缓存:能够大幅度降低DB IO的次数。

 缓存一般分:

页面缓存:多存储一些图片 js css等静态的东西

服务器缓存:自定义比较多,使用一些现有的集合框架,像MAP List等等存储在session中

数据库缓存:oracle等自带

专用缓存:  memcache,OSCache等

专用缓存位于服务器与数据库之间,如memcache,它是单线程,根据字节长度把内存划分为不同的段,这样虽然会降低内存利用率。但是会很高的提高数据命中率,查询复杂度为O(1).

你可能感兴趣的:(java,多线程,oracle,面试,中间件)