JDK的sql设计不合理导致的驱动类初始化死锁问题

问题描述
当我们一个系统既需要mysql驱动,也需要oracle驱动的时候,在并发加载初始化这些驱动类的过程中产生死锁的可能性非常大,下面是一个模拟的例子,对于Thread2的实现其实是jdk里java.sql.DriverService的逻辑,也是我们第一次调用java.sql.DriverManager.registerDriver注册一个驱动实例要走的逻辑(jdk1.6下),不过这篇文章是使用我们生产环境的一个系统的线程dump和内存dump为基础进行分析展开的。

阅读全文

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

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

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

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

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

阅读全文

Java 8:StampedLock、ReadWriteLock以及synchronized的比较

原文链接     作者:Tal Weiss   译者:iDestiny    校对:郭蕾

同步区有点像拜访你的公公婆婆。你当然是希望待的时间越短越好。说到锁的话情况也是一样的,你希望获取锁以及进入临界区域的时间越短越好,这样才不会造成瓶颈。

对于方法和代码块,语言层面的加锁机制是synchronized关键字,该关键字是由HotSpot虚拟机内置的。我们在代码中分配的每一个对象,如String、Array或者一个完整的JSON文档,在本地垃圾回收级别都具有内置的加锁能力。JIT编译器也是类似的,它在进行字节码的编译和反编译的时候,都取决于特定的某个锁的具体的状态和竞争级别。

同步块的关键是:进入临界区域内的线程不能超过一个 。这一点对于生产者消费者场景中来说非常糟糕,当一些线程独占地修改某些数据时,而另外一些线程只是希望读取数据,这个是可以和别的线程同时进行的。

阅读全文

如何写gdb命令脚本

作为UNIX/Linux下使用广泛的调试器,gdb不仅提供了丰富的命令,还引入了对脚本的支持:一种是对已存在的脚本语言支持,比如python,用户可以直接书写python脚本,由gdb调用python解释器执行;另一种是命令脚本(command file),用户可以在脚本中书写gdb已经提供的或者自定义的gdb命令,再由gdb执行。在这篇文章里,我会介绍一下如何写gdb的命令脚本。
阅读全文

JVM实用参数系列

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

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

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

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注释时进行类扫描的过程,发现了两个类的继承关系存在循环继承的情况而导致了栈溢出。
阅读全文

JVM实用参数(八)GC日志

原文地址:https://blog.codecentric.de/en/2014/01/useful-jvm-flags-part-8-gc-logging/

作者:,译者:Greenster 校对:梁海舰

本系列的最后一部分是有关垃圾收集(GC)日志的JVM参数。GC日志是一个很重要的工具,它准确记录了每一次的GC的执行时间和执行结果,通过分析GC日志可以优化堆设置和GC设置,或者改进应用程序的对象分配模式。
阅读全文

JVM实用参数(四)内存调优

原文地址译文地址,作者:,译者:郑旭东  校对:梁海舰

理想的情况下,一个Java程序使用JVM的默认设置也可以运行得很好,所以一般来说,没有必要设置任何JVM参数。然而,由于一些性能问题(很不幸的是,这些问题经常出现),一些相关的JVM参数知识会是我们工作中得好伙伴。在这篇文章中,我们将介绍一些关于JVM内存管理的参数。知道并理解这些参数,将对开发者和运维人员很有帮助。

所有已制定的HotSpot内存管理和垃圾回收算法都基于一个相同的堆内存划分:新生代(young generation)里存储着新分配的和较年轻的对象,老年代(old generation)里存储着长寿的对象。在此之外,永久代(permanent generation)存储着那些需要伴随整个JVM生命周期的对象,比如,已加载的对象的类定义或者String对象内部Cache。接下来,我们将假设堆内存是按照新生代、老年代和永久代这一经典策略划分的。然而,其他的一些堆内存划分策略也是可行的,一个突出的例子就是新的G1垃圾回收器,它模糊了新生代和老年代之间的区别。此外,目前的开发进程似乎表明在未来的HotSpot JVM版本中,将不会区分老年代和永久代。
阅读全文

Java 8学习资料汇总

本文首发于InfoQ

Java 8发布已经有一段时间,它被认为是Java 5发布以来最大的一次版本升级。Java 8 为Java语言、编译器、类库、开发工具以及JVM(Java虚拟机)带来了大量新特性。Lambda表达式、默认方法、并行API等都受到了开发者的追捧,社区上关于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的读操作将会被阻塞,直到收集到了足够的环境噪声为止

阅读全文

UNIX/Linux C 程序员需要掌握的七种武器

我是一名普通的软件工程师,不是什么技术大牛。这篇文章所提到的“七种武器”只是我这些年工作经验的一点体会和感悟,如果有错误的地方,还请大家指正。

(一)C语言

作为一名C程序员,熟练掌握C语言是最基本的一项技能。关于如何学好C语言,以及C语言话题的讨论,网上有很多经典的文章,我就不一一列举了。在这里,我只想谈一点我个人的体会:刚毕业时,我来到一家比较大的软件公司工作,而公司的工作模式是每个人只负责一个小模块。这样工作两年后,我自认为我的C语言水平已经很高了。后来,我来到现在这家公司。由于工作需要,接触的东西也多了,开源项目也了解一些,才发现自己的C语言能力太一般了:原来宏可以这样写,指针可以这样用…等等。现在我在写代码时,常常会想:这个行为是C语言规范定义的吗?如果是,是C89还是C99?我现在用的编译器支持吗?如果不是C语言规范定义的,那么在程序运行的这个平台,行为是确定的吗?所以我建议大家平时可以多想想这些问题,查查资料,相信一定会对C语言有更深的理解。

阅读全文

Maven入门指南(二)

原文链接 | 译文链接 | 译者:nkcoder | 审校:方腾飞

Maven目录结构

Maven有一个标准的目录结构。如果你在项目中遵循Maven的目录结构,就无需在pom文件中指定源代码、测试代码等目录。

Maven的目录结构布局,参考Maven标准目录结构介绍

以下为最重要的目录:

- src
  - main
    - java
    - resources
    - webapp
  - test
    - java
    - resources

- target

src目录是源代码和测试代码的根目录。main目录是应用的源代码目录。test目录是测试代码的目录。main和test下的java目录,分别表示应用的java源代码和测试代码。

resources目录包含项目的资源文件,比如应用的国际化配置的属性文件等。

如果是一个web项目,则webapp目录为web项目的根目录,其中包含如WEB-INF等子目录。

target目录是由Maven创建的,其中包含编译后的类文件、jar文件等。当执行maven的clean目标后,target目录会被清空。

阅读全文

Java 8 特性 – 终极手册

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

1.简介

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

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

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

阅读全文

Maven入门指南(一)

原文链接  译文链接  译者:nkcoder  校对:腾飞

Maven介绍:

Maven是一个强大的Java项目构建工具。当然,你也可以使用其它工具来构建项目,但由于Maven是用Java开发的,因此Maven被更多的用于Java项目中。

这篇教程的目的是帮助你理解Maven的工作机制。因此教程主要关注Maven的核心概念。一旦你理解了这些核心概念,当你想了解更多的细节时,再取查看Maven文档,或者从网上搜索,就变得容易多了。

事实上,Maven开发者认为Maven不仅仅是一个构建工具。你可以去阅读他们的文档Maven哲学,看看他们是怎么想的。但是现在,我们就把Maven当作一个构建工具,当你理解和开始使用Maven后,你就明白Mavan到底是什么了。

本教程基于Maven 3.0.5。Maven网站的地址为:http://maven.apache.org,你可以从该网站上下载最新版的Maven,并关注项目的进展。

 

阅读全文

JVM实用参数(一)JVM类型以及编译器模式

原文地址:https://blog.codecentric.de/en/2012/07/useful-jvm-flags-part-1-jvm-types-and-compiler-modes/

译者:赵峰,iDestiny    校对:郭蕾

现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定性方面做的非常出色。自适应内存管理、垃圾收集、及时编译、动态类加载、锁优化——这里仅仅列举了某些场景下会发生的神奇的事情,但他们几乎不会直接与普通的程序员相关。在运行时,JVM会不断的计算并优化应用或者应用的某些部分。

虽然有了这种程度的自动化(或者说有这么多自动化),但是JVM仍然提供了足够多的外部监控和手动调优工具。在有错误或低性能的情况下,JVM必须能够让专家调试。顺便说一句,除了这些隐藏在引擎中的神奇功能,允许大范围的手动调优也是现代JVM的优势之一。有趣的是,一些命令行参数可以在JVM启动时传入到JVM中。一些JVM提供了几百个这样的参数,所以如果没有这方面的知识很容易迷失。这系列博客的目标是着重讲解日常相关的一些参数以及他们的适用场合。我们将专注于Java6的Sun/Oracle HotSpot JVM,大多数情况下,这些参数也会适用于其他一些流行的JVM里。

阅读全文

return top