JAVA ’ 目录归档

Bug:StampedLock的中断问题导致CPU爆满

StampedLock作为JAVA8中出现的新型锁,很可能在大多数场景都可以替代ReentrantReadWriteLock。它对于读/写都提供了四个接口(换成write为写锁):

  • readLock()
  • tryReadLock()
  • tryReadLock(long time, TimeUnit unit)
  • readLockInterruptibly()

这几个方法对应的语义为:

  • 获取读锁(阻塞,不响应中断)
  • 获取读锁(立即)
  • 限时获取读锁(响应中断)
  • 获取读锁(阻塞,响应中断)

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Bug:StampedLock的中断问题导致CPU爆满


JVM实用参数系列

原文发表于CodeCentric博客,经原作者Sven Ruppert授权由并发编程网翻译并分享。

JVM是Java Virtual Machine(Java虚拟机)的缩写,Java通过使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java具备了一次编写,多处运行的特性。JVM一直是Java学习中的重点,也是难点。并发编程网组织翻译了JVM实用参数系列文章,旨在帮助大家了解JVM的结构以及相关参数。JVM实用参数系列一共包括八篇文章,由浅入深,从编译器、垃圾回收、内存调优等方面介绍JVM。

特别感谢CodeCentric AG授权我们翻译此部分文章;同时感谢译者赵峰、郑旭东、Greenster、iDestiny、张军、李洪柱以及参与校对的主编们。由于翻译时间仓促,内容难免有疏漏之处,敬请批评指正。另外我们接下来会翻译一些关于垃圾回收算法和垃圾回收器的优质文章,敬请期待。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JVM实用参数系列


tomcat启动时检测到循环继承而栈溢出的问题

一个用户在使用tomcat7054版本启动的时候遇到的错误:

Caused by: java.lang.IllegalStateException: 
Unable to complete the scan for annotations for web application [/test] 
due to a StackOverflowError. Possible root causes include a too low setting 
for  -Xss and illegal cyclic inheritance dependencies. 

The class hierarchy being processed was 

[org.jaxen.util.AncestorAxisIterator->
org.jaxen.util.AncestorOrSelfAxisIterator->
org.jaxen.util.AncestorAxisIterator]

at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2112)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2059)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1934)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1900)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1885)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1317)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:876)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:374)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5355)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

这是在tomcat解析servlet3注释时进行类扫描的过程,发现了两个类的继承关系存在循环继承的情况而导致了栈溢出。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: tomcat启动时检测到循环继承而栈溢出的问题


Java 8学习资料汇总

本文首发于InfoQ

Java 8发布已经有一段时间,它被认为是Java 5发布以来最大的一次版本升级。Java 8 为Java语言、编译器、类库、开发工具以及JVM(Java虚拟机)带来了大量新特性。Lambda表达式、默认方法、并行API等都受到了开发者的追捧,社区上关于Java 8的学习资料如雨后春笋般涌现。下面是一些优秀的学习资料汇总:

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java 8学习资料汇总


JVM上的随机数与熵池策略

在apache-tomcat官方文档:如何让tomcat启动更快 里面提到了一些启动时的优化项,其中一项是关于随机数生成时,采用的“熵源”(entropy source)的策略。

他提到tomcat7的session id的生成主要通过java.security.SecureRandom生成随机数来实现,随机数算法使用的是”SHA1PRNG”

private String secureRandomAlgorithm = "SHA1PRNG";

在sun/oracle的jdk里,这个算法的提供者在底层依赖到操作系统提供的随机数据,在linux上,与之相关的是/dev/random/dev/urandom,对于这两个设备块的描述以前也见过讨论随机数的文章,wiki中有比较详细的描述,摘抄过来,先看/dev/random

在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JVM上的随机数与熵池策略


Java 8 特性 – 终极手册

原文链接原文作者:Andrey Redko ,译者:Justin,校对:郭蕾

1.简介

毫无疑问,Java 8是自Java  5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器、类库、开发工具和JVM(Java虚拟机)。在这篇教程中我们将会学习这些新特性,并通过真实例子演示说明它们适用的场景

本教程由下面几部分组成,它们分别涉及到Java平台某一特定方面的内容:

  • 语言
  • 编译器
  • 类库
  • 开发工具
  • 运行时(Java虚拟机)

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java 8 特性 – 终极手册


JVM实用参数(六) 吞吐量收集器

原文链接 本文连接 译者:张军  校对:梁海舰

在实践中我们发现对于大多数的应用领域,评估一个垃圾收集(GC)算法如何根据如下两个标准:

  1. 吞吐量越高算法越好
  2. 暂停时间越短算法越好

首先让我们来明确垃圾收集(GC)中的两个术语:吞吐量(throughput)和暂停时间(pause times)。 JVM在专门的线程(GC threads)中执行GC。 只要GC线程是活动的,它们将与应用程序线程(application threads)争用当前可用CPU的时钟周期。 简单点来说,吞吐量是指应用程序线程用时占程序总用时的比例。 例如,吞吐量99/100意味着100秒的程序执行时间应用程序线程运行了99秒, 而在这一时间段内GC线程只运行了1秒。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JVM实用参数(六) 吞吐量收集器


Java 7: 全面教程-1.3 集成开发环境(IDEs)

1.3集成开发环境(IDEs)
你完全可以用文本编辑器来写Java 程序。但是,IDE会更方便。它不仅仅可以检查你的代码语法,还可以自动填写代码,检测,和调试你的程序。另外,在你输入的时候就自动编译了,还有运行Java程序只要点击个按钮就行。这样,可以节省你很多时间。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java 7: 全面教程-1.3 集成开发环境(IDEs)


Java 7: 全面教程-1.1 第一个Java程序

1.1第一个Java程序
这个小节主要介绍的是关于Java 开发的主要步骤:写代码,转换成字节码,和运行字节码。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java 7: 全面教程-1.1 第一个Java程序


Java 7: 全面教程-目录

Java 7- A Comprehensive Tutorial

Java 7- A Comprehensive Tutorial

Java 7: 全面教程 第一版

原文链接
作者:Budi Kurniawan
译者:郑玉婷

目录

介绍

第一章节:Java 初体验
第二章节:语言基础
第三章节:语句
第四章节:对象和类
第五章节:核心类
第六章节:继承
第七章节:出错处理
第八章节:数字和数据
第九章节:接口和抽象类 阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java 7: 全面教程-目录


JVM实用参数(五)新生代垃圾回收

原文链接  作者: PATRICK PESCHLOW ;译者:严亮

本部分,我们将关注堆(heap) 中一个主要区域,新生代(young generation)。首先我们会讨论为什么调整新生代的参数会对应用的性能如此重要,接着我们将学习新生代相关的JVM参数。

单纯从JVM的功能考虑,并不需要新生代,完全可以针对整个堆进行操作。新生代存在的唯一理由是优化垃圾回收(GC)的性能。更具体说,把堆划分为新生代和老年代有2个好处:简化了新对象的分配(只在新生代分配内存),可以更有效的清除不再需要的对象(即死对象)(新生代和老年代使用不同的GC算法)

通过广泛研究面向对象实现的应用,发现一个共同特点:很多对象的生存时间都很短。同时研究发现,新生对象很少引用生存时间长的对象。结合这2个特点,很明显 GC 会频繁访问新生对象,例如在堆中一个单独的区域,称之为新生代。在新生代中,GC可以快速标记回收”死对象”,而不需要扫描整个Heap中的存活一段时间的”老对象”。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JVM实用参数(五)新生代垃圾回收


15个顶级Java多线程面试题及回答

原文链接  ,原文作者: Javin Paul ,  译者:赵峰

Java 线程面试问题

在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的。他们会问面试者很多令人混淆的Java线程问题。面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面。用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并发的。下面这些是我在不同时间不同地点喜欢问的Java线程问题。我没有提供答案,但只要可能我会给你线索,有些时候这些线索足够回答问题。现在引用Java5并发包关于并发工具和并发集合的问题正在增多。那些问题中ThreadLocal、Blocking Queue、Counting Semaphore和ConcurrentHashMap比较流行。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 15个顶级Java多线程面试题及回答


《Netty 权威指南》—— 选择Netty的理由

声明:本文是《Netty 权威指南》的样章,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文。

在开始本节之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果2个多月过去了,他们的NIO服务端始终无法稳定,问题频出。由于NIO通信是它们的核心组件之一,因此,项目的进度受到了严重的影响,领导对此非常恼火。另一个项目组直接使用Netty作为NIO服务端,业务的定制开发工作量非常小,测试表明,功能和性能都完全达标,项目组几乎没有在NIO服务端上花费额外的时间和精力,项目进展也非常顺利。

这两个项目组的不同遭遇提醒我们:开发出高质量的NIO程序并不是一件简单的事情,除去NIO固有的复杂性和BUG不谈,作为一个NIO服务端需要能够处理网络的闪断、客户端的重复接入、客户端的安全认证、消息的编解码、半包读写等等,如果你没有足够的NIO编程经验积累,一个NIO框架的稳定往往需要半年甚至更长的时间。更为糟糕的是一旦在生产环境中发生问题,往往会导致跨节点的服务调用中断,严重的可能会导致整个集群环境都不可用,需要重启服务器,这种非正常停机会带来巨大的损失。

从可维护性角度看,由于NIO采用了异步非阻塞编程模型,而且是一个IO线程处理多条链路,它的调试和跟踪非常麻烦,特别是生产环境中的问题,我们无法有效调试和跟踪,往往只能靠一些日志来辅助分析,定位难度很大。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《Netty 权威指南》—— 选择Netty的理由


《Netty 权威指南》—— 4种IO的对比

声明:本文是《Netty 权威指南》的样章,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文。

2.5.1.概念澄清

为了防止由于对一些技术概念和术语的理解或者叫法不一致引起歧义,本小节特意对本书中的专业术语或者技术用语做下声明,如果它们与其它的一些技术书籍术语不一致,请以本小节的解释为准。

2.5.1.1. 异步非阻塞IO

很多人喜欢将JDK1.4提供的NIO框架称为异步非阻塞IO,但是,如果严格按照Unix网络编程模型和JDK的实现进行区分,实际上它只能被称为非阻塞IO,不能叫异步非阻塞IO。在早期的JDK1.4和1.5 update10版本之前,JDK的Selector基于select/poll模型实现,它是基于IO复用技术的非阻塞IO,不是异步IO。在JDK1.5 update10和linux core2.6以上版本,sun优化了Selctor的实现,它底层使用epoll替换了select/poll,上层的API并没有变化,我们可以认为是JDK NIO的一次性能优化,但是它仍旧没有改变IO的模型。相关优化的官方说明如下:

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《Netty 权威指南》—— 4种IO的对比


Java并发编程基础

1. 并发

1.1. 什么是并发?

并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力。如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互性将大大改善。现代的PC都有多个CPU或一个CPU中有多个核。是否能合理运用多核的能力将成为一个大规模应用程序的关键。

1.2. 进程 vs. 线程

进程是以独立于其他进程的方式运行的,进程间是互相隔离的。一个进程无法直接访问另一个进程的数据。进程的资源诸如内存和CPU时间片都是由操作系统来分配。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java并发编程基础


return top