在Java中提升函数以更好地“函数式”编程

Java8中的Stream和Optional给我们带来了函数式编程的乐趣,但Java仍然缺少很多函数编程的关键特性。Lambda表达式、Optional和Stream只是函数式编程的冰山一角。这也导致了varvrfunctionlajava这些类库的出现,他们都源于Haskell这个纯函数式编程语言。

如果想要更加地“函数式”编程,那么首先要注意的是不要过早的中断monad(一种设计模式,表示将一个运算过程通过函数拆解成互相连接的多个步骤。只要提供下一步运算所需的函数,整个运算就会自动进行下去, Optional、Stream都是monad),比如,很多人经常会在还不需要的时候就调用了Optional.get()和Stream.collect()提前终止monad。本文主要讲述如何通过提升方法来使得代码更”函数式”。

《Java工程师修炼之道》内容概览

最近几个月由于工作和正在筹备《Java工程师修炼之道》一书的原因一直没有写新的文章。不过,忙里偷闲,自己陆续读完了《格鲁夫给经理人的第一课》、《架构真经》、《聊聊架构》这几本书,收获了不少干货,之前自己挖坑的《一些架构设计原则》一文后面会尽快填上。本文则先介绍一下《Java工程师修炼之道》一书^_^。

《Java工程师修炼之道》一书主要内容是Java后端工程师必备的基本技能大纲。内容主要来自于公司内的后端工程师学习计划、自己以前的一些博客文章和自己从业以来积累的知识库。但由于后端工程师的每一个技能点都具有一定的深度,都不是一两篇文章就能讲述清楚的,因此本书不可能对每一个技能点都讲的特别透彻。

本书可以看做是一本Java工程师的入职指南,也可以看做一本串联Java后端技能点的参考手册。对其中每一个技能点的学习,推荐通过他们的官方文档来深入学习,此外,本书也给出了自己觉得有价值的参考学习书籍。

JVM诊断调优CheatSheet

包含诊断调优java应用的各种命令以及jvm配置示例。

常用Shell命令

  • 查看网络状况

      netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    
  • 使用top去获取进程cpu使用率;使用/proc文件查看进程所占内存。

      #!/bin/bash
      for i in `ps -ef | egrep -v "awk|$0" | awk '/'$1'/{print $2}'`
      do
          mymem=`cat /proc/$i/status 2> /dev/null | grep VmRSS | awk '{print $2" " $3}'`
          cpu=`top -n 1 -b |awk '/'$i'/{print $9}'`
      done
    

如何读取ClassPath下的资源

最近在写一些公共组件时,碰到了需要读取classpath下文件的场景。也突然想起其实之前有很多场景牵扯到读取类加载路径下的文件内容、路径,包括非jar包和jar包中的。总结一下,以备后续使用。

JDK自带工具之问题排查场景示例

目录

最近看到了大量关于java性能调优、故障排查的文章,自己也写了一篇Java调优经验谈。接着此篇文章,其实一直打算写写一些常用调优工具以及它们的惯常用法的。后来在http://java-performance.info这个站点上看到了类似的一篇博文,自我感觉很有指导意义。于是决定翻译+重组织一下此篇文章:Java server application troubleshooting using JDK tools

引言

在Java世界中,我们的很多开发工作从编码、调试到调优都在使用GUI工具。我们经常尝试在本地构建一套和线上一样的环境从而使得问题能够重现,进而使用我们常用的工具来排查定位故障。但不幸的是,很多情况下是无法在本地重现线上问题的。例如,我们没有权限获取真实客户端提交到线上服务端的数据。

由此,很多时候都是需要远程来排查线上服务器上发生的问题。但是如果单单只有一个JRE的话,你也不可能有合适的办法来进行排查。你需要JDK或者第三方的工具。有时候使用JDK提供的工具就是最可取的方案,毕竟,在线上环境使用第三方工具有时候会牵扯到权限的问题。

一般情况下,在线上环境安装JDK发布版本可以让排查进行地更高效。建议安装使用最新的Java7/8 JDK或者构建与线上JRE匹配的一些工具(原文作者不建议安装jdk的发布版本,而是建议根据实际需求逐渐地安装其中的工具)。

[译]使用Groovy的AST Transformation实现DSL

最近在看一些java开源项目时,发现不少是用gradle做为项目构建工具的。之前虽然也用过gradle,但是却没怎么仔细留意build.gradle的语法是groovy的。但这次再怎么看也觉得里面的好多语法都和以前用过的groovy都联系不到一起。各种懵逼状态。。。后来阅读了这篇文章,算是解答了一些疑问:http://www.cnblogs.com/CloudTeng/p/3418072.html。但是对于下面这种写法,还是不知道是怎么回事:

task copyFile(type: Copy){
    from 'xml'
    into 'destination'
}

copyFile做为task名称竟然不是一个字符串,阅读了groovy的文档也没发现字符串可以省略引号的说明(php中引号倒是可以省略),此外一个方法后面跟一个参数然后这个参数又跟着一个括号,这又是什么语法。。。凭直觉觉得这里的copyFile应该是一个方法,但是这时候copyFile还没有定义啊。。。

带着以上疑问,去翻了一下groovy的官方文档,凭感觉觉得gradle是利用了groovy的ast trasnfomation,也就是抽象语法树转换(故名思议,也就是能够转换groovy的语法树从而创造自己的一套语法)。那么到底是不是这样呢?http://blog.csdn.net/zxhoo/article/details/29830529给出了解释并证明了这个结论。但是groovy的ast transformation到底是什么东西呢?国外有一篇博客给出了比较清晰明了的讲述:http://www.jroller.com/DhavalDalal/entry/a_case_for_using_groovy。以下即对此篇博文的翻译。

JDK自带工具之概览

在我们平常对java程序进行问题排查、性能调优时,如果没有合适的工具,很多时候会事倍功半,甚至无法继续进行下去。其实,jdk自身已经提供了很多强大的工具供我们使用。本文就对这些工具做一个概览性的描述。

笔者的开发环境是:OS X EI Captian 10.11.6

JDK版本:

java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)

JAVA_HOME/bin下的工具截图如下:

Java调优经验谈

目录

对于调优这个事情来说,一般就是三个过程:

  • 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统、应用的监控工具来发现问题。
  • 性能分析:问题已经发生,但是你并不知道问题到底出在哪里。此时就需要使用工具、经验对系统、应用进行瓶颈分析,以求定位到问题原因。
  • 性能调优:经过上一步的分析定位到了问题所在,需要对问题进行解决,使用代码、配置等手段进行优化。

Java调优也不外乎这三步。

此外,本文所讲的性能分析、调优等是抛开以下因素的:

  • 系统底层环境:硬件、操作系统等
  • 数据结构和算法的使用
  • 外部系统如数据库、缓存的使用

BTrace原理浅析

之前在看agentzh的此篇博文动态追踪技术漫谈时,领会到了动态追踪技术的强大之处,也一直由于无法在不重启线上服务器的情况下排查线上问题在寻找Java中的动态追踪工具。在公司内部的JavaEE性能检测框架中,我们使用了asm做字节码注入来做线上性能的监测,沿着这个思路,如果要做到动态追踪应该是需要做字节码注入的,但是额外的一点是需要动态加载字节码替换掉原有的类的。此外,性能监测框架是需要耦合到业务应用中的,无法做到一个监测工具的灵活性。

后来听同事提到了BTrace这个工具,于是去尝试了一下。BTrace是SUN Kenai云计算开发平台下的一个开源项目,旨在为java提供安全可靠的动态跟踪分析工具。江南白衣的这篇文章http://calvin1978.blogcn.com/articles/btrace1.html做了比较详细的描述。

那么,BTrace这么神奇的功能是如何实现的呢?既然这是个开源的代码,那么直接从代码找原理。BTrace代码开源在https://github.com/btraceio/btrace