`

java虚拟机优化小结

 
阅读更多
  Java HotSpot虚拟机供了多种垃圾回收器,每一种垃圾回收器都是为了满足不同的需求和环境。通常情况下,Java虚拟机会根据当前运行的应用程序选择一个合适的垃圾回收器。但当我们有一个需要加载很多类,尤其是数据量特别庞大的应用程序时,如何正确选择一个垃圾回收器是至关重要的。


  J2SE1.4之前,Java虚拟机不支持并行垃圾回收,所以垃圾回收对一个基于多处理器系统的影响很大。下图是一个扩展性很好的系统模型,但是垃圾回收的效率不尽人意。红线是一个只在垃圾回收上使用1%时间的应用程序,当它运行在32个处理器上的系统上是,20%的生产力被浪费掉了。




  Ergonomics是在j2se1.5中加入的一个新功能,它可以为一个几乎或者没有通过命令行参数优化的系统提供一个较好的性能表现。它主要通过选择如下项目来实现优化。

  • garbage collector 垃圾收集器
  • heap size 堆内存大小
  • and runtime compiler 运行时编译


  当虚拟机启动时,这些选项是以所运行的应用程序的特征来被Ergonomics选择的。通常会已运行当前应用程序行的机器类型作为参考(大的应用程序运行在性能好的机器上)。添加这些选项是最简单的优化虚拟机的方式。

  JavaSE平台的一个强项就是避免用户过多的去考虑内存如何分配,然而一但垃圾回收遇到瓶颈,我们对垃圾回收的实现机制有所了解还是很有必要的。垃圾回收器对应用程序使用对象的方式作出一些假设,这些假设反映在那些可调优的参数上。通过调整这些参数,系统的性能能够得到提升,与此同时系统的抽象性不会受到影响。

  当一个对象没有任何引用指向它时,它会被当作'垃圾'。最简单直接的垃圾回收算法是遍历所有能够被指向到的对象,所有未被指向到的对象,就当作'垃圾'了。这个算法实现的时间和当前存活对象的个数成正比,因此这种算法被禁止使用在会有很多存活对象的大型应用程序上。

  从J2SE 1.2开始,虚拟机合并了很多不同垃圾回收算法,并用以分代回收的方式将它们组合起来。比较幼稚的垃圾回收算法会检查每一个在heap中存活的对象,分代回收算法则通过分析和观察那些已经被证实的,能满足大多数应用程序最小化工作的一些特性来声明无用('垃圾')对象。其中最重要的被观察特性就是'弱代假说'(weak generational hypothesis),其含义就是大多数对象只需要存活一小段的时间。


  下图中蓝色部分是典型的对象生命周期分布。x轴为对象的生命周期,量度为分配的字节大小。y轴上的字节数是对象总字节数与之相对应的生命周期。



  有一些对象确实需要长时间的存活,所以它们的分布区域已经超出图的右侧。例如一些对象在程序初始化的是就被分配空间,当程序结束后才被释放。除了这两种极值以外的是那些存活一段时间的对象。高效的垃圾回收就是要致力于使大多数对象都英年早逝。

  为了达到这种优化情况,内存被以代(generation )来管理,换而言之内存池存储着不同'年龄'的对象。垃圾回收发生在不同代被填满的时候。大多数的对象被分配内存的时候,都被发配到了新生代(young generation),并且大多数都终身待在那里。当新生代被填满的,会导致minor collection,此时只有新生代中对象会被回收,其它代中的'垃圾'对象不会被回收。Minor collections可以通过假设弱分代中大多数对象都是'垃圾'并可以被回收来被优化。一些在新生代垃圾回收后存活下来的对象会被转移到老生代(tenured generation)。最终老生代会被填满,然后需要垃圾回收。此时会进行major collection,把整个heap都回收掉。Major collection通常要比minor collection占用更长的时间,因为一大堆对象都要参与回收。
 
  默认的generation被划分成如下图。



  当初始化时,最大的内存地址被虚拟化的保留着,不会分配任何物理内存,除非有需要的时候。整个内存地址空间被分为young和tenured代。
  新生代由一个eden和两个survivor spaces组成。大多数对象一开始被分配到eden中。一个survivor space一直是空的,用来作为转移eden中的活对象到另一个survivor space中的中转区。活对象在两个区域内不停的交换,直到被转移到老生代。
  第三个代和老生代相邻,它叫做用生代(permanent generation),用来保存那些虚拟机描述对象的数据。例如对象描述类和方法定义。

  衡量垃圾回收性能主要通过两个指标

  生产力指的是没有用在垃圾回收上的时间和总时间的百分比。
  暂停 指的是应用程序失去响应的时间,这个时候正在进行垃圾回收。
  用户对垃圾回收有不同的需求。例如一个Web服务器应用,垃圾回收时的暂停是可以忍受的,但如果一个图形交互系统有少量的暂停都会影响用户的体验。

 
 

 
  • 大小: 17.1 KB
  • 大小: 32.2 KB
  • 大小: 39.3 KB
分享到:
评论

相关推荐

    Java虚拟机

    这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近10次,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的...

    Java基础知识小结

    ### Java基础知识小结 #### 1.1 `getPath()`、`getAbsolutePath()`、`getCanonicalPath()`的区别 在Java中,处理文件路径时经常会用到`getPath()`、`getAbsolutePath()`以及`getCanonicalPath()`这三个方法。它们...

    java调用RMI小结

    RMI(Remote Method Invocation,远程方法调用)是Java平台中用于分布式计算的一种技术,它允许一个Java对象调用另一个在不同 JVM(Java虚拟机)上的对象的方法,从而实现跨网络的通信。Java RMI 提供了一种透明的...

    java中守护进程小结

    Java中的守护线程(Daemon Threads)是用于支持应用程序运行的重要组件,它们在后台执行任务,不会阻止Java虚拟机(JVM)的退出。守护线程的主要任务是为其他非守护线程提供服务,例如垃圾回收线程就是典型的守护...

    Java内存分配、管理小结.doc

    - 本地方法栈与Java栈类似,但它是为Java虚拟机执行本地(非Java)方法服务的。 5. **程序计数器(Program Counter Register)**: - 每个线程都有一个程序计数器,记录当前线程正在执行的Java虚拟机指令的地址。...

    深入理解Android:卷I--详细书签版

    8.3.5 初识Surface小结 309 8.4 深入分析Surface 310 8.4.1 与Surface相关的基础知识介绍 310 8.4.2 SurfaceComposerClient分析 315 8.4.3 SurfaceControl分析 320 8.4.4 writeToParcel和Surface对象的创建 ...

    传智播客毕向东Java基础课堂笔记

    #### 小结 本章节概述了Java的基础概念和技术要点,包括Java的特点、运行机制、开发环境的搭建、注释、标识符、变量和命名规则等内容。这些基础知识对于深入学习Java至关重要,也是后续章节讨论更复杂主题的基础。...

    18天java笔记(txt版)

    15. **Java虚拟机(JVM)**:了解JVM的工作原理,如类加载、内存管理和垃圾回收,有助于优化程序性能。 这份18天的Java笔记涵盖了这些核心概念,通过逐天学习,你可以逐步构建起对Java语言的全面理解。每章节都可能...

    Java初学者—java的学习路径.doc

    - `java`: 启动Java虚拟机(JVM),执行`.class`文件 - `javac`: Java编译器,用于将`.java`源文件编译成`.class`文件 - `jar`: Java打包工具,用于创建、更新和管理`.jar`文件 - `javadoc`: Java文档生成器,根据源...

    RMI入门小结

    【RMI(Remote Method Invocation)入门小结】 远程方法调用(RMI)是Java平台上的一个关键特性,它允许Java对象在不同的JVM(Java虚拟机)之间进行通信,从而实现分布式计算。RMI机制使得开发者可以像调用本地方法...

    Android内存管理小结

    与传统的Java虚拟机(JVM)不同,Dalvik虚拟机执行的是.dex文件格式的字节码,这种格式经过了专门的设计,以便更有效地运行在移动设备上。 - **Dalvik的优势**: - 在编译阶段就进行了代码优化,而不是在运行时动态...

    基于Java的拼图游戏设计.doc

    平台无关性是Java的一大优势,由于Java虚拟机(JVM)的存在,使得Java代码可以在任何支持JVM的操作系统上运行。安全性方面,Java避免了C++中的指针操作,降低了病毒入侵的风险,同时通过安全管理器提供保护。面向...

    Java高级编译器调优.pdf

    在Java高级编译器调优中,我们主要探讨的是JIT(Just-In-Time)编译器的优化技术,这是Java虚拟机(JVM)性能提升的关键。JIT编译器能够在程序运行时将字节码转化为机器码,以提高执行效率。本节详细介绍了编译器的...

    探究Java常量本质及三种常量池(小结)

    "探究Java常量本质及三种常量池" Java中的常量池是Java虚拟机(JVM)中的一种机制,用于存储编译期...通过了解常量池的工作机制,我们可以更好地理解Java虚拟机的工作机制,并优化我们的代码,提高代码的性能和效率。

    Java基础知识面试必备

    - **技术**: Java虚拟机(JVM)通过优化实现了高效运行,如即时编译(JIT)技术可以将热点代码转化为本地机器码,显著提升执行速度。 - **表现**: 在大多数应用场景下,Java程序的运行速度接近甚至超过了C++等传统编译型...

Global site tag (gtag.js) - Google Analytics