`

JVM常见配置汇总

    博客分类:
  • JAVA
 
阅读更多


从这个图中可以看到,JVM是运行在操作系统之上的,它与硬件没有直接的交互。我们再来看下JVM有哪些组成部分,如下图所示:



整个JVM分为四部分:

Class Loader 类加载器
类加载器的作用是加载类文件到内存,比如编写一个HelloWord.java程序,然后通过javac编译成class文件,那怎么才能加载到内存中被执行呢?Class Loader承担的就是这个责任,那不可能随便建立一个.class文件就能被加载的,Class Loader加载的class文件是有格式要求,在《JVM Specification》中式这样定义Class文件的结构:

友情提示:Class Loader只管加载,只要符合文件结构就加载,至于说能不能运行,则不是它负责的,那是由Execution Engine负责的

Execution Engine 执行引擎
执行引擎也叫做解释器(Interpreter),负责解释命令,提交操作系统执行。

Native Interface本地接口
本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序,Java诞生的时候是C/C++横行的时候,要想立足,必须有一个聪明的、睿智的调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies。目前该方法使用的是越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机,或者Java系统管理生产设备,在企业级应用中已经比较少见,因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用Web Service等等

Runtime data area运行数据区
运行数据区是整个JVM的重点。我们所有写的程序都被加载到这里,之后才开始运行,Java生态系统如此的繁荣,得益于该区域的优良自治,下一章节详细介绍之。

整个JVM框架由加载器加载文件,然后执行器在内存中处理数据,需要与异构系统交互是可以通过本地接口进行,瞧,一个完整的系统诞生了!


[b]堆设置
  -Xms:初始堆大小
  -Xmx:最大堆大小
  -XX:NewSize=n:设置年轻代大小
  -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
  -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
  -XX:MaxPermSize=n:设置持久代大小


收集器设置
  -XX:+UseSerialGC:设置串行收集器
  -XX:+UseParallelGC:设置并行收集器
  -XX:+UseParalledlOldGC:设置并行年老代收集器
  -XX:+UseConcMarkSweepGC:设置并发收集器

垃圾回收统计信息
  -XX:+PrintGC
  -XX:+PrintGCDetails
  -XX:+PrintGCTimeStamps
  -Xloggc:filename

并行收集器设置
  -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
  -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
  -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
  -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
  -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。



调优总结

年轻代大小选择
响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。


年老代大小选择

响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
  1. 并发垃圾收集信息
  2. 持久代并发收集次数
  3. 传统GC信息
  4. 花在年轻代和年老代回收上的时间比例
减少年轻代和年老代花费的时间,一般会提高应用的效率


吞吐量优先的应用
一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。


较小堆引起的碎片问题
因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:
    1. -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
    2. -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩


可以从不同的的角度去划分垃圾回收算法:[/b]

按照基本回收策略分

引用计数(Reference Counting):
比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

标记-清除(Mark-Sweep):



此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。


复制(Copying):



此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。

标记-整理(Mark-Compact):




此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。


按分区对待的方式分

增量收集(Incremental Collecting):实时垃圾回收算法,即:在应用进行的同时进行垃圾回收。不知道什么原因JDK5.0中的收集器没有使用这种算法的。

分代收集(Generational Collecting):基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。





按系统线程分

串行收集:串行收集使用单线程处理所有垃圾回收工作,因为无需多线程交互,实现容易,而且效率比较高。但是,其局限性也比较明显,即无法使用多处理器的优势,所以此收集适合单处理器机器。当然,此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。

并行收集:并行收集使用多线程处理垃圾回收工作,因而速度快,效率高。而且理论上CPU数目越多,越能体现出并行收集器的优势。

并发收集:相对于串行收集和并行收集而言,前面两个在进行垃圾回收工作时,需要暂停整个运行环境,而只有垃圾回收程序在运行,因此,系统在垃圾回收时会有明显的暂停,而且暂停时间会因为堆越大而越长。






























































  • 大小: 8.5 KB
  • 大小: 9.8 KB
  • 大小: 10.3 KB
  • 大小: 13.5 KB
  • 大小: 19.8 KB
分享到:
评论

相关推荐

    Jboss_JVM优化

    4. 常见配置汇总 -堆设置相关参数,如-Xms和-Xmx设置初始和最大堆大小,-Xss设置线程堆栈大小。 -收集器设置相关参数,如-XX:+UseSerialGC设置串行收集器,-XX:+UseParallelGC设置并行收集器,-XX:+UseParallelOldGC...

    答辩常见问题汇总.doc

    【答辩常见问题汇总】 在答辩过程中,可能会遇到各种与项目相关的问题,这些问题涵盖了数据库连接、系统测试、网页设计等多个方面。以下是对这些知识点的详细解释: 1. **数据库连接**:通常通过Java的JDBC(Java ...

    2020年最新版--Java+最常见的+200++面试题汇总+答案总结汇总

    Zookeeper在分布式系统中的角色,如配置管理、服务发现等,也是考察点。 【网络编程】 网络编程的基础,如TCP/IP协议、HTTP协议、Socket编程,以及Java的网络API,如ServerSocket和Socket,是面试中的常见话题。 ...

    Java 基础、并发、JVM、计算机网络、操作系统、MySQL、Redis、高并发设计等常见面试问题汇总

    - **主从复制**:如何配置Redis的主从复制以提高可用性。 8. **高并发设计**: - **负载均衡**:了解Nginx、HAProxy等负载均衡器,以及轮询、最少连接等调度策略。 - **分布式锁**:分布式环境下的锁实现,如...

    一份通向理想互联网公司的面试汇总,包括 Java基础、Java并发、JVM、MySQL

    标题中的知识点涵盖了Java基础、Java并发编程以及JVM与MySQL数据库的相关内容,这些都是在互联网公司面试中常见的技术领域。现在,让我们深入探讨这些主题。 **Java基础** Java是一门广泛使用的面向对象编程语言,...

    Java 最常见的 200+ 面试题汇总以及答案总结汇总.pdf

    这份"Java 最常见的 200+ 面试题汇总以及答案总结汇总.pdf"提供了全面的复习材料,涵盖了从基础到高级的各种主题。 首先,Java基础部分包括JDK和JRE的区别。JDK(Java Development Kit)是用于开发和运行Java程序的...

    Java高级面试题和常见面试及答案汇总.rar

    本资源包含"Java高级面试题整理(附答案).docx"和"最常见的Java面试题及答案汇总(一).docx"两份文档,旨在为求职者提供全面的准备材料。 1. **Java基础** - 数据类型:包括基本数据类型和引用数据类型的区别与...

    最新版--Java+最常见的+200++面试题汇总+答案总结汇总.pdf

    Java 面试题汇总 在这篇文章中,我们将总结了 Java 面试中的 200 多个问题,涵盖了 Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、...

    125条常见的java 面试笔试题大汇总

    13. **性能优化**:理解JVM调优,包括类加载、内存配置、垃圾回收策略等。同时,如何通过代码优化提升程序性能也是面试的重要部分。 这份"125条常见的java面试笔试题大汇总"不仅包含了上述知识点,还可能包含更多...

    Java常见200道面试题汇总

    本篇文章汇总了200道Java面试题,涵盖了从基础到高级的各个层面,包括Java基础、容器、多线程、反射、对象拷贝、Java Web、异常处理、网络编程、设计模式、SSM框架(Spring、Spring MVC)、Spring Boot/Spring Cloud...

    weblogic常见故障总结.docx

    本文档汇总了WebLogic Server在运行过程中可能会遇到的一些常见故障,包括内存溢出错误、服务器启动失败等问题,并给出了相应的日志报错、排查思路以及解决方案。 一、Server类故障 1.1 故障编号:...

    java常见面试题汇总和解答

    11. **安全与性能**:面试者应了解如何防止SQL注入、XSS攻击,理解HTTPS的工作原理,以及性能调优的手段,如JVM内存模型、垃圾回收机制、线程池配置等。 以上就是Java面试中常见的知识点和解答方向,熟练掌握这些...

    常见面试题汇总(有选择看).zip

    这份"常见面试题汇总(有选择看).zip"文件很可能是包含了一系列Java相关的面试题目,旨在帮助应聘者准备即将到来的技术面试。以下是一些可能涵盖的知识点,根据描述,我们将重点讨论Java编程的基础、进阶特性以及面试...

    125条常见的java面试笔试题大汇总

    为了在激烈的竞争中脱颖而出,了解和掌握常见的Java面试笔试题至关重要。这里,我们汇总了125条关键知识点,帮助你全面准备Java面试。 1. **Java基础** - 了解Java的历史、特点和适用场景。 - 掌握Java的基本语法...

    125条常见的java面试笔试题汇总

    16. **JVM优化**:了解JVM的内存结构,理解类加载机制,学习JVM调优策略。 17. **Spring框架**:理解依赖注入和AOP的概念,知道如何配置和使用Spring Bean。 18. **MyBatis**:了解MyBatis的工作原理,知道如何...

    Tomcat常见问题集锦(持续更新)

    【标题】:“Tomcat常见问题集锦(持续更新)” 在Java Web开发中,Tomcat作为最常用的开源应用服务器,其稳定性和性能是开发者关注的重点。这篇博客文章旨在收集和解决Tomcat在实际运行中遇到的各种问题,为开发者...

    Java常见问题集锦

    ### Java常见问题集锦 #### 1. Java2 (JDK 1.2) 的环境配置 - **问题描述**:如何在不同操作系统上正确配置Java2(即JDK 1.2)的环境变量? - **解决方案**: - **Solaris平台**: - 设置`JAVA_HOME`为Java2的...

    2023-Java面试资料汇总

    本篇将基于提供的"2023-Java面试资料汇总"来深入探讨Java相关的技术要点,包括JVM(Java虚拟机)、开源框架、集合、多线程、网络、微服务以及中间件等领域。 首先,我们来讨论JVM,它是Java程序运行的基础。JVM负责...

Global site tag (gtag.js) - Google Analytics