
Java 精华文章
文章平均质量分 91
kobejayandy
十多年互联网产品研发经验,历经华为、腾讯、字节跳动等公司,主要从事后端技术研发及技术管理工作(andyjaykobe)
展开
-
理解 JVM 如何使用 Windows 和 Linux 上的本机内存
虚拟地址空间大小可能比处理器的物理地址大小更小。32 位 Intel x86 最初拥有的 32 位物理地址仅允许处理器寻址 4GB 存储空间。后来,添加了一种称为物理地址扩展(Physical Address Extension,PAE)的特性,将物理地址大小扩大到了 36 位,允许安装或寻址至多 64GB RAM。PAE 允许操作系统将 32 位的 4GB 虚拟地址空间映射到一个较大的物理地址范转载 2012-09-03 23:31:09 · 1093 阅读 · 0 评论 -
Maven 使用指南
1. 什么是maven?Maven 是一项软件工程管理工具,它是基于一种工程对象模型的概念(POM),它可以管理一个工程的建造,和来自于信息中心的报道和文档,可以以网站的形式展现与项目相关的信息。2. Maven的关键词Project:任何想要build的事务,maven都可以认为它们是工程。这些工程被定义为工程对象模型(POM,project object model)。一个工程可以转载 2012-09-21 00:45:31 · 1077 阅读 · 0 评论 -
Maven中如何配置WAR依赖WAR包
项目背景:1. war项目C和war项目B都依赖war项目A和JAR项目D.项目A中保存了B和C项目通用的web资源,比如通用的javascript,CSS,jsp等.项目D中保存了B和C项目中都依赖的一些class2. 开发人员希望每次都只面对一个项目,即Team A 开发项目A, Team B开发项目B, Team C开发项目C,以此类推3. 每转载 2012-11-03 16:34:09 · 21498 阅读 · 1 评论 -
Maven项目中如何同时Install成JAR和WAR包
项目背景:项目在一个super pom工程下,有多个平行module,在各级依赖中,有一个module在 pom中定义 package war,但是开发阶段,只需要其中的jar包来使用。如果一直使用其 war 包来开发调试,maven overlay会占用较多时间。于是新的需求就是:将这个module同时打包 jar和 war并 intall到本地 reposi转载 2012-11-03 16:32:37 · 12980 阅读 · 2 评论 -
基于OSGi的动态化系统搭建
OSGi允许您把您的应用程序分成多个模块,并能管理这些模块之间的依赖性。本文向您介绍基于OSGi的动态化系统的搭建,对动态化系统的优点和基于OSGi的搭建做简单的演示。搭建动态化的系统是作为Java开发人员一直就非常追求的目标,一个系统能够动态化就意味着:51CTO编辑推荐:OSGi入门与实践全攻略◆ 添加新功能时不需要重启系统;◆ 修改已存在的功能时不需要重启系统;◆ 删除一转载 2013-01-23 23:56:56 · 741 阅读 · 0 评论 -
OSGi为什么重要:向模块化转移的主攻手
OSGi是一个Java企业级开源框架,近年来得到了很多方面的关注。本文作者Patrick认为OSGi是过去20年间兴起的一种革命性的技术,因为它代表了长期软件开发发展中下一个合理的步骤。他评论OSGi的优势在于提供了标准的Java软件包,是从非模块化转移到模块化的重要技术。本文为JavaLobby社区上的一篇文章。OSGi是一个Java企业级开源框架,近年来得到了很多方面的关注。看到很多博客文转载 2013-01-23 23:46:05 · 864 阅读 · 0 评论 -
OSGi是什么:Java语言的动态模块系统
本文介绍了OSGi是什么,以及OSGi容器的一些现状。OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础架构。之前51CTO曾发过一篇文章叫做《OSGi为什么重要:向模块化转移的主攻手》,里面对于OSGi的优势进行了分析。不过,对于究竟什么是OSGi,很多人仍然只有一个模糊的概念。本系列(你好,OSGi)从基础开始介绍了OSGi。本部分介绍OSGi是什么,以及OSGi转载 2013-01-23 23:52:14 · 1105 阅读 · 0 评论 -
一个优秀的Java程序员必须了解GC的工作原理
一个优秀的Java程序员必须了解GC的工作原理、如何优化GC的性能、如何与GC进行有限的交互,因为有一些应用程序对性能要求较高, 例如嵌入式系统、实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能。本篇文章首先简单介绍GC的工作原理之后, 然后再对GC的几个关键问题进行深入探讨,最后提出一些Java程序设计建议,从GC角度提高Java程序的性能。 GC转载 2013-03-16 15:56:27 · 1193 阅读 · 0 评论 -
CXF BUS
CXF中的BUS就是一个骨架,管理着CXF的扩展插件以及提供拦截器。注意,BUS提供的拦截器与具体的服务endpoint提供的拦截器是有一点区别的。BUS提供的拦截器将作用于所有的收到、发送以及错误(Fault)的消息。默认情况下,BUS没有为我们提供任何拦截器。 一,BUS提供全局拦截器功能 下面来举例子说明,如何为所有的endpoint提供日志拦截:转载 2013-04-21 17:49:08 · 4077 阅读 · 0 评论 -
实例分析Java Class的文件结构
今天把之前在Evernote中的笔记重新整理了一下,发上来供对java class 文件结构的有兴趣的同学参考一下。学习Java的朋友应该都知道Java从刚开始的时候就打着平台无关性的旗号,说“一次编写,到处运行”,其实说到无关性,Java平台还有另外一个无关 性那就是语言无关性,要实现语言无关性,那么Java体系中的class的文件结构或者说是字节码就显得相当重要了,其实Java从刚开始的时转载 2013-04-29 22:39:40 · 1110 阅读 · 0 评论 -
深入讲解HashMap
HashMap先从构造函数讲起吧HashMap有很多个构造函数,不过我们比较常用的是不带参数的默认构造函数,其源代码如下:[java] view plaincopyprint?public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; threshold = (i转载 2013-06-02 16:20:22 · 1236 阅读 · 0 评论 -
从程序员到CTO的Java技术路线图
在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了。但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平。 Java程序员高级特性 反射、泛型、注释符、自动装箱和拆箱、枚举类、可变 参数、可变返回类型、增强循环、静态导入 核心编程转载 2013-06-03 21:25:00 · 1328 阅读 · 0 评论 -
几种通信协议的性能比较
总体性能比较:Socket(BIO/NIO)>RMI>HTTPInvoker>=Hessian>REST>>Burlap>EJB>>Web Service1.socket如 果协议设计的比较好,Socket性能毫无疑问是最高,同时灵活性和复杂度也最高,如果采用高效的网络框架如:Mina、Netty等可以降低开发复杂 度,一般在对性能有非常苛刻的条件下使用。2.RMIRMI的性能转载 2013-06-18 00:29:14 · 1888 阅读 · 0 评论 -
数据库事务并发有关问题
多个事务同时访问数据库时候,会发生下列5类问题,包括3类数据读问题(脏读,不可重复读,幻读),2类数据更新问题(第一类丢失更新,第二类丢失更新):1,脏读(dirty read)A事务读取B事务尚未提交的更改数据,并在这个数据基础上操作。如果B事务回滚,那么A事务读到的数据根本不是合法的,称为脏读。在oracle中,由于有version控制,不会出现脏读。2,不可重复读(unrepea转载 2013-06-24 22:53:28 · 1408 阅读 · 0 评论 -
spring 五个事务隔离级别和七个事务传播行为
Spring在TransactionDefinition接口中定义了五个不同的事务隔离级别ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应 ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据转载 2013-06-24 23:07:44 · 2216 阅读 · 0 评论 -
Java NIO框架之Mina、Netty、Grizzly介绍与对比
在开始Mina入门之前,最好先对现有的主流Java NIO框架作一个简单的了解,本文对Java NIO框架Mina、Netty、Grizzly作简单的介绍与对比。我们先来看看三者之间的简介。Mina:Mina(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和转载 2013-06-26 23:04:41 · 1995 阅读 · 0 评论 -
Java开源数据库连接池比较(c3p0,dbcp和 proxool)
DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用可以设置最大和最小连接,连接等待时间等,基本功能都有,此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降,此外不提供连接池监控 C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,转载 2013-07-18 01:11:16 · 1588 阅读 · 0 评论 -
阻塞队列
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列,下图展示了如何通过阻塞队列来合作:转载 2013-07-18 21:46:55 · 940 阅读 · 0 评论 -
Effective Java 中文第二版
第1章引言第2章创建和销毁对象第1条:考虑用静态工厂方法代替构造器第2条:遇到多个构造器参数时要考虑用构建器第3条:用私有构造器或者枚举类型强化Singleton属性第4条:通过私有构造器强化不可实例化的能力第5条:避免创建不必要的对象第6条:消除过期的对象引用第7条:避免使用终结方法第3章对于所有对象都通用的方法第8条:覆盖equals时请遵守通用约定转载 2013-08-01 21:05:52 · 1143 阅读 · 0 评论 -
Effective Java (并发)
一、对共享的可变数据的同步访问: 在Java中很多时候都是通过synchronized关键字来实现共享对象之间的同步的。事实上,对象同步并不仅限于当多个线程操作同一可变对象时,仍然能够保证该共享对象的状态始终保持一致。与此同时,他还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改效果。 Java的语言规范保证了读写一个变量是原子的,转载 2013-08-01 21:36:28 · 1011 阅读 · 0 评论 -
Java序列化和Hessian序列化的区别
在远程调用中,需要把参数和返回值通过网络传输,这个使用就要用到序列化将对象转变成字节流,从一端到另一端之后再反序列化回来变成对象。这里就简单讲讲Java序列化和hessian序列化的区别。首先,hessian序列化比Java序列化高效很多,而且生成的字节流也要短很多。但相对来说没有Java序列化可靠,而且也不如Java序列化支持的全面。而之所以会出现这样的区别,则要从它们的实现方式来看。先转载 2013-07-28 16:36:46 · 3683 阅读 · 0 评论 -
Java Reference概念整理
Strong Reference, 强引用,即java标准的引用方式,表示GC从 Root Set 开始向下扫描,可以找到对应的 Strong Reference。Referent,被包装为 Weak, Soft, Phantom Reference的对象引用称之为 referent。后面的内容会多次提到这个名词。Weak Reference, 弱引用。当一个referent,在运行时转载 2013-08-22 23:36:40 · 752 阅读 · 0 评论 -
Java的JAR包, EAR包 ,WAR包内部结构
JAR包JAR 文件格式以流行的 ZIP 文件格式为基础; 与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用; JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的转载 2013-08-11 15:29:46 · 9141 阅读 · 0 评论 -
根据资源路径加载ZIP压缩包中指定的资源
JAR、WAR、EAR、在文件结构上,三者并没有什么不同,它们都采用ZIP或JAR档案文件压缩格式。针对ZIP压缩文档中的类文件或者配置文件,如何根据该资源路径就能直接加载到其文件流呢? java.util.zip包中的ZipFile类和ZipEntry类两者结合即可根据资源的路径加载到其对应的文件流。 // 根据ZIP压缩包中资源的路径获取ZipEntry原创 2013-08-11 22:51:11 · 2120 阅读 · 0 评论 -
使用ClassLoader加载包内的资源
ClassLoader可以把包(jar包,war包)内的class文件加载到 JVM中,第一步就是将class文件以stream的方式读取出来。ClassLoader也将这个加载资源的方法 getResourceAsStream暴露了出来。编程时可以使用这个方法来加载包内的任何资源,比如properties文件,图片等。使用ClassLoader加载资源文件当使用ClassLoader加载转载 2013-08-11 23:36:37 · 1842 阅读 · 0 评论 -
URI和URL有什么区别
从JDK1.5开始,java.net包对统一资源定位符(uniform resource locator URL)和统一资源标识符(uniform resource identifier URI)作了非常有用的区分。URI是个纯粹的句法结构,用于指定标识Web资源的字符串的各个不同部分。URL是URI的一个特例,它包含了定位Web资源的足够信息。其他URI,比如mailto:cay@horst转载 2013-08-11 23:57:14 · 9718 阅读 · 1 评论 -
Java序列化的机制和原理
序列化是什么:序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。序列化的什么特点:如果某个转载 2013-07-28 17:37:16 · 1229 阅读 · 0 评论 -
使用并监控proxool连接池
Proxool一个数据库连接池框架,提供了对你选择的其它类型的驱动程序的连接池封装。这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。下面是Proxool使用方法:1) 到http://sourceforge.net/projects/proxool/ 下载,并配置到工程中2)用web-inf/proxool.xml配置连接池转载 2013-08-27 23:13:55 · 4827 阅读 · 0 评论 -
Java应用从集中式步入分布式
记得Martin大叔在《企业应用架构模式》中特别强调:“能够不分布式的应用就不要分布式”,这句话没什么问题,尤其对于做过分布式应用的人而言,就更会有深刻的体会了,但这个世界偏偏就没有那么简单,大多数人都会碰到分布式应用的场景,尤其是对于大型应用而言,从集中式步入分布式是不可避免的,只是也许是小型分布式的,也许是大型分布式的;也许是有高性能要求的,也许是没有的,在这篇blog中我们来看看java应用转载 2013-08-28 23:10:18 · 1174 阅读 · 0 评论 -
Guice与Spring框架的区别
Guice与Spring的对比 SpringGuice使用XML使用将类与类之间的关系隔离到xml中,由容器负责注入被调用的对象,因此叫做依赖注入不使用xml,将类与类之间的关系隔离到Module中,声名何处需要注入,由容器根据Module里的描述,注入被调用的对象。使用Annotation 使用支持自定义Annotation标注,对转载 2013-09-14 00:31:02 · 1969 阅读 · 0 评论 -
Guice指南-架构概览
我们可以将 Guice 的架构分成两个不同的阶段:启动和运行。你在启动时创建一个注入器 Injector,在运行时用它来注入对象。启动你通过实现 Module 来配置 Guice。你传给 Guice 一个模块对象,Guice 则将一个绑定器 Binder 对象传入你的模块,然后,你的模块使用绑定器来配置绑定。一个绑定通常包含一个从接口到具体实现的映射。例如:public class转载 2013-09-14 15:45:53 · 1936 阅读 · 0 评论 -
Java自动拆箱装箱
1.Java数据类型 在介绍Java自动装箱和拆箱之前,先来了解一下Java的数据类型。 在Java中,数据类型可以分为两大种,Primitive Type(基本类型)和Reference Type(引用类型)。基本类型的数值不是对象,不能作为对象调用其toString()、hashCode()、getClass()、equals()等等方法。所以针对8种基本数转载 2013-09-15 16:55:56 · 1333 阅读 · 0 评论 -
Java.lang.reflect简单讲解
在Java运行时刻,能否知道一个类的属性方法并调用改动之?对于任意一个对象,能否知道他的所属类,并调用他的方法?答案是肯定的。这种动态的获取信息及动态调用方法的机制在Java中称为“反射”(reflection)。Java反射机制主要提供以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调转载 2013-09-15 15:09:14 · 8187 阅读 · 0 评论 -
利用反射操作泛型
反射+泛型相关的接口类型概述(1). 和反射+泛型有关的接口类型java.lang.reflect.Type:java语言中所有类型的公共父接口java.lang.reflect.ParameterizedTypejava.lang.reflect.GenericArrayTypejava.lang.reflect.WildcardType(2). 体系结构图1. Type转载 2013-09-15 16:20:57 · 7018 阅读 · 1 评论 -
通过Guice 进行依赖项注入
构造器注入public class FrogMan{@Injectpublic FrogMan(Vehicle vehicle) { this.vehicle = vehicle;}}到目前为止,我展示了 @Inject 应用于构造函数的用法。当 Guice 找到注释时,它会挑选构造函数参数,并试图为每个参数找到一个配置绑定。这称为构造函数注入。根据 Guice转载 2013-09-14 16:14:46 · 1877 阅读 · 0 评论 -
深入理解Java注解(Annotation)
Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口。除此之外,Java在 java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素,该接口主要有如下几个实现类: Class:类定义 Constructor:构造器定义 Field:累的成员变量定义 Met转载 2013-09-14 16:31:24 · 1343 阅读 · 0 评论 -
Java 注解的几大作用及使用方法详解
Java 注解,从名字上看是注释,解释。但功能却不仅仅是注释那么简单。注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种:生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等 跟踪代码依赖性,实现替代配置文件功能。比转载 2013-09-15 14:12:21 · 1339 阅读 · 0 评论 -
关于Java thread的interrupt, isInterrupt, interrupted
在《Java网络编程》上看到一个例子, 说是用thread.interrupt()去关闭在等待的线程。不太明白,于是去查了一下Java的API。 有兴趣的同行们可以先看看API的内容,再看以下总结: 1. thread.isInterrupt()和Thread.interrupted()都返回当前线程interrupt的状态thread.isInterrupt(转载 2013-10-02 22:31:30 · 1449 阅读 · 0 评论 -
Jetty Continuation机制
Continuation机制Continuation机制是Jetty用于更好的支持异步Servlet的机制。 首先简要介绍一下技术应用的背景。异步请求是指当客户端发送一个请求到服务器的时候,客户端不必一直等待服务器的响应,例如Web 2.0中的Ajax(Asynchronous JavaScript and XML)技术、JDBC连接池等,当服务器端响应返回时,客户端利用一个 Javasc转载 2013-10-01 17:01:35 · 3479 阅读 · 1 评论 -
Servlet 3之异步处理特性
开源Servlet容器Jetty 7.0发布转载 2013-09-30 23:57:21 · 2049 阅读 · 0 评论