Fork me on GitHub

java

JVM性能分析工具jstack介绍

JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外, 还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,每一种工具都有其自身的特点, 用户可以根据你需要检测的应用或者程序片段的状况,适当的选择相应的工具进行检测, 先通过一个表格形式简要介绍下这几个命令的作用和使用方法。本文重点介绍jstack的使用方法。 命令 作用 jps 基础工具 jstack 查看某个Java进程内的...

JDK的两个版本解释

每次去Oracle官网去下载JDK,就会发现有两个版本,一个基数版本,一个偶数版本。比如最新的jdk-8u191和jdk-8u192。这是咋回事? 这是官方对于奇数版本与偶数版本区别的解释: 从JDK版本7u71以后,JAVA将会在同一时间发布两个版本的JDK,其中: 奇数版本为BUG修正并全部通过检验的版本,官方强烈推荐使用这个版本。 偶数版本包含了奇数版本所有的内容,以及未被验证的BUG修复,Oracle官方表示:除非你深受BUG困扰,否则不推荐您使用这个奇数版本。

聊聊Reactor I/O模型

上一篇介绍了Unix系统支持的I/O模型,以及相应的在Java中的实现方式。本篇重点讲解一下Reactor模型原理和实现机制。 I/O多路复用又被称为“事件驱动”,就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪), 能够通知程序进行相应的读写操作,技术上是通过调用操作系统的select、pselect、poll、epoll来实现。 与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必...

聊聊Java中的几种I/O模型

同步、异步、阻塞、非阻塞都是和I/O(输入输出)有关的概念,最简单的文件读取就是I/O操作。而在文件读取这件事儿上,可以有多种方式。 本篇会先介绍一下I/O的基本概念,通过一个生活例子来分别解释下这几种I/O模型,以及Java支持的I/O模型。 基本概念在解释I/O模型之前,我先说明一下几个操作系统的概念 文件描述符fd文件描述符(file descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。 文件描述符在形式上是一个非负整数。实际...

Java几种常用JSON库性能比较

上一篇介绍了Java性能测试框架JMH的使用方法,本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能。 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库。但是百闻不如一见,只有自己亲手测试过的才是最值得相信的。 JSON不管是在Web开发还是服务器开发中是相当常见的数据传输格式,一般情况我们对于JSON解析构造的性能并不需要过于关心,除非是在性能要求比较高的系统。 目前对于Java开源的JSON类库有很多种,下面我们取4个常用的JSON库进...

Java微基准测试框架JMH

JMH,即Java Microbenchmark Harness,这是专门用于进行代码的微基准测试的一套工具API。 JMH 由 OpenJDK/Oracle 里面那群开发了 Java 编译器的大牛们所开发 。何谓 Micro Benchmark 呢? 简单地说就是在 method 层面上的 benchmark,精度可以精确到微秒级。 Java的基准测试需要注意的几个点: 测试前需要预热。 防止无用代码进入测试方法中。 并发测试。 测试结果呈现。 比较典型的使用场景...

使用WatchService监听文件变化

在Java 7发布的新的IO框架中,除了大家都熟知的 FileVisitor 接口外,还有个 WatchService 接口经常被人忽视掉。 这个类可以让你实时的监控操作系统中文件的变化,包括创建、更新和删除事件。 WatchService 用来观察被注册了的对象的变化和事件。它和Watchable两个接口的配合使用, WatchService类似于在观察者模式中的观察者,Watchable类似域观察者模式中的被观察者。 而Java 7中的java.nio.file.P...

OSGi简易教程

开篇我先解释一下两个容易搞混的术语: OSGi: The Open Services Gateway Initiative(开放服务网关协议),是用来模块化开发和部署Java应用程序和库(library)的一种架构,已经成为Java模块化事实上的标准了。详细解释请参考OSGi简介 WSGI: Web Server Gateway Interface(Web服务器网关接口),具体的来说,WSGI是一个Python专用规范,定义了Web服务器如何与Python应用程序进行...

NIO笔记-缓存器细节

用缓存器操纵数据 Buffer由数据和可以高效访问以及操纵这些数据的四个索引组成,这四个索引是:mark、position、limit、capacity。下表是用于设置和复位索引以及查询它们的方法: 方法 说明 capacity() 返回缓存区容量 clear() 清空缓存区,position=0,limit=capacity,此方法可覆写缓存区 flip() limit=position,position=0,用于准备从缓存区读取已经写入的数据 ...

java中的回调函数

最近学习内部类的时候,对Java实现回调函数机制有了进一步了解,自己整理点比较,希望大家可以相互讨论。所谓回调,就是允许客户类通过内部类引用来调用其外部类的方法,这是一种非常灵活的功能。 由于java暂时还不能显示支持闭包(Closure),不过听说新版可以支持了,不过我还没用过。现在暂时用的是非静态内部类实现回调功能。 情形一 假设有一个老师Teacher对象,平时的工作是上课,周末的工作在家干农活(乡村老师大部分都这样),方法名都是work,但功能都不一样,可以用内...

centos6上安装Hadoop和HBase

操作系统:CentOS 6.5 64位 在linux环境安装Hadoop之前,我们需要使用到ssh,所以要先安装ssh,并且创建一个hadoop用户 备注: 下面所有的命令中,以#开头的表示是root用户,以$开头的是普通用户 安装SSH先切换到root用户,执行下列步骤 rpm -qa |grep ssh #检查是否装了SSH包 yum install openssh-server #安装ssh chkconfig --list sshd #检查SSHD是否设置为...

Java8中的lambda表达式

2014年3月18日,Oracle终于发布Java8正式版。在新的版本里面加入了很多特性, 总共增加了55个新特性,其中最最吸引人的就是Lambdas表达式和Stream函数式编程,本文详细讲解这两个特性。 其他特性比如日期API,泛型,反射,注解,集合框架,并发,Nashorn引擎等等这里暂时就不详细介绍了。 具体可以参考:http://openjdk.java.net/projects/jdk8/features 昨天参加了Oracle的Java8宣讲活动,有幸目睹...

Java内存区域与内存溢出异常

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 按照《Java虚拟机规范(第2版)》的规定,Java虚拟机所管理的内存将包括以下几个运行时数据区域,来个图更加直观点,如下图所示: 程序计数器Program Counter Register是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。 每个线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储。此内存区域是唯一一个在J...

fastjson对Date的处理

fastjson对日期的序列化方式 一种方法是通过注解 @JSONField (format="yyyy-MM-dd HH:mm:ss") public Date birthday; 另一种是通过SerializeConfig: private static SerializeConfig mapping = new SerializeConfig(); private static String dateFormat; static { ...

servlet filter详解

在写一个springmvc项目中想对用户的请求进行拦截,只有登录用户才能访问资源。 这时候可以使用到SpringMVC的拦截器Intercepter,但是这个只能局限在SpringMVC中使用, 如果想更加通用一点,最好使用Servlet Filter实现这个需求。 本文将通过几个实际的例子展示下Servlet中的Filter的使用。 我们为什么需要使用Filter?通常我们会使用session来保存登录用户的信息,通过从session中取出保存的属性值来判断用户是否登...

SiteMesh使用笔记

SiteMesh的介绍就不多说了,主要是用来统一页面风格,减少重复编码的。 它定义了一个过滤器,然后把页面都加上统一的头部和底部。 在maven工程的pom.xml中加入SiteMesh依赖: <dependency> <groupId>opensymphony</groupId> <artifactId>sitemesh</artifactId> <version>2.4....