JVM ’ 目录归档

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实用参数系列

JVM实用参数(二)参数分类和即时(JIT)编译器诊断

作者: PATRICK PESCHLOW     原文地址    译者:赵峰 校对:许巧辉

在这个系列的第二部分,我来介绍一下HotSpot JVM提供的不同类别的参数。我同样会讨论一些关于JIT编译器诊断的有趣参数。

JVM 参数分类

HotSpot JVM 提供了三类参数。第一类包括了标准参数。顾名思义,标准参数中包括功能和输出的参数都是很稳定的,很可能在将来的JVM版本中不会改变。你可以用java命令(或者是用 java -help)检索出所有标准参数。我们在第一部分中已经见到过一些标准参数,例如:-server。
阅读全文

JVM实用参数(七)CMS收集器

原文连接 本文连接  译者: iDestiny  校对:梁海舰

HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间。该目标对于大多数交互式应用很重要,比如web应用。在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器的操作和使用它时可能出现的主要挑战。

就像吞吐量收集器(参见本系列的第6部分),CMS收集器处理老年代的对象,然而其操作要复杂得多。吞吐量收集器总是暂停应用程序线程,并且可能是相当长的一段时间,然而这能够使该算法安全地忽略应用程序。相比之下,CMS收集器被设计成在大多数时间能与应用程序线程并行执行,仅仅会有一点(短暂的)停顿时间。GC与应用程序并行的缺点就是,可能会出现各种同步和数据不一致的问题。为了实现安全且正确的并发执行,CMS收集器的GC周期被分为了好几个连续的阶段。
阅读全文

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

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实用参数(六) 吞吐量收集器

JVM实用参数(三)打印所有XX参数及值

原文地址:https://blog.codecentric.de/en/2012/07/useful-jvm-flags-part-3-printing-all-xx-flags-and-their-values/

译者李洪柱     校对:方腾飞

本篇文章基于Java 6update 21oder 21之后)版本, HotSpot JVM 提供给了两个新的参数,在JVM启动后,在命令行中可以输出所有XX参数和值。

-XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial

让我们现在就了解一下新参数的输出。以 -client 作为参数的 -XX:+PrintFlagsFinal   的结果是一个按字母排序的590个参数表格(注意,每个release版本参数的数量会不一样)

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JVM实用参数(三)打印所有XX参数及值

Java字节码浅析(二)

英文原文链接译文链接,原文作者:James Bloom,译者:有孚

条件语句

像if-else, switch这样的流程控制的条件语句,是通过用一条指令来进行两个值的比较,然后根据结果跳转到另一条字节码来实现的。

循环语句包括for循环,while循环,它们的实现方式也很类似,但有一点不同,它们通常都会包含一条goto指令,以便字节码实现循环执行。do-while循环不需要goto指令,因为它的条件分支是在字节码的末尾。更多细节请参考循环语句一节。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java字节码浅析(二)

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

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

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

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

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

阅读全文

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

Java字节码浅析(—)

英文原文链接译文链接,原文作者:James Bloom,译者:有孚

明白Java代码是如何编译成字节码并在JVM上运行的非常重要,这有助于理解程序运行的时候究竟发生了些什么。理解这点不仅能搞清语言特性是如何实现的,并且在做方案讨论的时候能清楚相应的副作用及权衡利弊。

本文介绍了Java代码是如何编译成字节码并在JVM上执行的。想了解JVM的内部结构以及字节码运行时用到的各个内存区域,可以看下我前面的一篇关于JVM内部细节的文章

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java字节码浅析(—)

面向GC的Java编程

感谢同事【沐剑】的投稿

Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题。以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象,就交给GC来做吧!甚至有人说,如果在编程过程中频繁考虑内存问题,是一种退化,这些事情应该交给编译器,交给虚拟机来解决。

阅读全文

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

JVM的重排序

感谢同事【沐剑】的投稿

重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。重排序分为两类:编译期重排序运行期重排序,分别对应编译时和运行时环境。

在并发程序中,程序员会特别关注不同进程或线程之间的数据同步,特别是多个线程同时修改同一变量时,必须采取可靠的同步或其它措施保障数据被正确地修改,这里的一条重要原则是:不要假设指令执行的顺序,你无法预知不同线程之间的指令会以何种顺序执行。

但是在单线程程序中,通常我们容易假设指令是顺序执行的,否则可以想象程序会发生什么可怕的变化。理想的模型是:各种指令执行的顺序是唯一且有序的,这个顺序就是它们被编写在代码中的顺序,与处理器或其它因素无关,这种模型被称作顺序一致性模型,也是基于冯·诺依曼体系的模型。当然,这种假设本身是合理的,在实践中也鲜有异常发生,但事实上,没有哪个现代多处理器架构会采用这种模型,因为它是在是太低效了。而在编译优化和CPU流水线中,几乎都涉及到指令重排序。 阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JVM的重排序

自己动手写GC

原文链接译文链接,原文作者: Robert Nystrom,译者:有孚

当事情多得我喘不过气来的时候,我会出现一种异常的反应,就是找点别的事做,就能摆脱烦恼了。通常我会自己写一些独立的小程序。

有一天早上,我正在写书,工作,还要为Strang Loop准备的分享,这些东西让我感到快崩溃了,突然间我想到,“我要写一个垃圾回收程序”。

是的,我知道这听起来有点疯狂。不过你可以把我这个神经的想法当成是一堂编程语言基础的免费教程。通过百来行普通的C代码,我实现了一个标记删除的收集器,你懂的,它的确能回收内存。

在程序开发领域,垃圾回收就像一片鲨鱼出没的水域,不过在本文中,这只是个儿童池,你可以随意玩耍。(说不定还是会有鲨鱼,不过至少水浅多了不是?)

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 自己动手写GC

你所不知道的有关Java 和Scala中的同步问题

原文:Things You Didn’t Know About Synchronization in Java and Scala   译者: 李杰聪

在实际应用中所有的服务端程序都需要在多线程之间进行某种同步。大多数同步已经有框架完成了,比如我们的web服务器,DB客户端和消息框架。Java和Scala提供了大量的组件用来实现稳定的多线程程序。包括对象池,并发集合,高级锁,执行上下文等。

为了更好的理解这些组件,我们深入了解一下最常用的同步原语——对象所。这个是用synchronized 关键字来实现的,在Java中它是非常流行的多线程原语。这也是其他更复杂模式的基础,比如线程池和连接池,并发集合等。

Synchronized 关键字主要用在以下两个场景:

  1. 作为方法的修饰,此方法在同一个时间只能被一个线程执行。
  2. 把一个代码块声明为临界区,任何时间只有一个线程能访问。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 你所不知道的有关Java 和Scala中的同步问题

JVM Attach机制实现

感谢支付宝同事【寒泉子】的投稿

attach是什么

在讲这个之前,我们先来点大家都知道的东西,当我们感觉线程一直卡在某个地方,想知道卡在哪里,首先想到的是进行线程dump,而常用的命令是jstack <pid>,我们就可以看到如下线程栈了

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JVM Attach机制实现

JVM性能优化, Part 5:Java的伸缩性

感谢朋友【吴杰】投递本文。

JVM性能优化系列文章由Eva Andearsson在javaworld上发表共计5篇文章,ImportNew上有前4篇译文。本文(第5篇)由吴杰翻译自:javaworld 。

很多程序员在解决JVM性能问题的时候,花开了很多时间去调优应用程序级别的性能瓶颈,当你读完这本系列文章之后你会发现我可能更加系统地看待这类的问题。我说过JVM的自身技术限制了Java企业级应用的伸缩性。首先我们先列举一些主导因素。

  • 主流的硬件服务器提供了大量的内存
  • 分布式系统有大量内存的需求,而且该需求在持续增长
  • 一个普通Java应用程序所持有的对空间大概在1GB~4GB,这远远低于一个硬件服务器的内存管理能力以及一个分布式应用程序的内存需求量。这被称之为Java内存墙,如下图所示(图中表述Java应用服务器和常规Java应用的内存使用量的演变史)。

图 1 Java内存墙(1980~2010)

Java内存墙

Java内存墙

上图源自:Azul Systems 阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JVM性能优化, Part 5:Java的伸缩性

JVM 内部运行线程介绍

感谢同事[觉梦]投递此稿。

hi,all

最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据。  前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来进行分析。  stack 里面线程非常多,排查起来需要一定的经验,所以,对它们有一定了解,可以提高排查问题的效率。  现在网上资料也不是特别全,所以,导致很多新人在拿到一个stack文件之后,也不知知道从何看起。 下面我把这次整理的一些个人认为比较常见的线程列出来。 阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JVM 内部运行线程介绍

return top