- 浏览: 198352 次
- 性别:
- 来自: 上海
文章分类
最新评论
从这个图中可以看到,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数目越多,越能体现出并行收集器的优势。
并发收集:相对于串行收集和并行收集而言,前面两个在进行垃圾回收工作时,需要暂停整个运行环境,而只有垃圾回收程序在运行,因此,系统在垃圾回收时会有明显的暂停,而且暂停时间会因为堆越大而越长。
发表评论
-
Java 5 并发学习(转)
2012-06-26 14:38 863Java 5 并发学习 在Java5之后,并发线程这块发生 ... -
WeakHashMap和HashMap的区别
2012-02-24 13:42 845http://mzlly999.iteye.com/blog/ ... -
volatile 的高级模式
2012-02-22 13:07 736前面几节介绍的模式涵盖了大部分的基本用例,在这些模式中使用 v ... -
The "Double-Checked Locking is Broken" Declaration
2012-02-22 10:34 961http://www.cs.umd.edu/~pugh/jav ... -
Log4j配置文件详细说明[转]
2012-02-14 10:48 1346属性文件Properties properties属性文件 ... -
Log4j的配置文件
2012-02-14 10:42 817Log4j支持两种配置文件格式,一种是java属性文件(键—值 ... -
单例模式的俩种方式
2012-01-04 14:09 937等等 单例模式的俩种方式: 饿汉式 class Singlet ... -
Mysql连接数据库:PreparedStatement.addBatch()方法
2011-12-23 08:43 58211.Eclipse连接MySQL数据库 mysql>C ... -
java中ArrayList 、LinkList区别
2011-12-21 15:30 1172java中ArrayList 、LinkList、List区别 ... -
Thread的实现
2011-12-21 14:25 1206Making a Thread A thread in Jav ... -
Date4j,一个简约的日期处理类库
2011-12-14 10:13 848Java本身的日期类在JDK1.0版本之后就再也没有更新过,同 ... -
How to use Log4j
2011-09-29 13:57 8121. LogManager.getInstance().get ... -
重写hashCode和equals方法(转)
2011-09-27 09:58 1136如果你的对象想散列存 ... -
学习Enum转
2011-09-22 14:11 8751. 关于 Java Enum: 学过 C/C++ 等 ... -
PO BO VO DTO POJO DAO概念及其作用(转)
2011-09-20 09:49 665J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨 ... -
Thread的实现
2011-09-20 09:47 859Thread的实现 1.extend Thread,then ... -
Adapter模式(转)
2011-08-17 15:48 890[b]GOF《设计模式》一书对Adapter模式是这样描述的: ... -
Abstract or Interface
2011-08-11 15:02 729详解java中的抽象类和接 ... -
HashMap HashTable TreeMap
2011-08-11 13:45 966Map中我们通过对象来对对象进行索引,用来索引的对象叫做key ... -
多线程死锁问题(转)
2011-08-10 19:42 586前天俺们谈到了加锁,但是在使用加锁的同时又会带来一个问题,就是 ...
相关推荐
4. 常见配置汇总 -堆设置相关参数,如-Xms和-Xmx设置初始和最大堆大小,-Xss设置线程堆栈大小。 -收集器设置相关参数,如-XX:+UseSerialGC设置串行收集器,-XX:+UseParallelGC设置并行收集器,-XX:+UseParallelOldGC...
【答辩常见问题汇总】 在答辩过程中,可能会遇到各种与项目相关的问题,这些问题涵盖了数据库连接、系统测试、网页设计等多个方面。以下是对这些知识点的详细解释: 1. **数据库连接**:通常通过Java的JDBC(Java ...
Zookeeper在分布式系统中的角色,如配置管理、服务发现等,也是考察点。 【网络编程】 网络编程的基础,如TCP/IP协议、HTTP协议、Socket编程,以及Java的网络API,如ServerSocket和Socket,是面试中的常见话题。 ...
- **主从复制**:如何配置Redis的主从复制以提高可用性。 8. **高并发设计**: - **负载均衡**:了解Nginx、HAProxy等负载均衡器,以及轮询、最少连接等调度策略。 - **分布式锁**:分布式环境下的锁实现,如...
标题中的知识点涵盖了Java基础、Java并发编程以及JVM与MySQL数据库的相关内容,这些都是在互联网公司面试中常见的技术领域。现在,让我们深入探讨这些主题。 **Java基础** Java是一门广泛使用的面向对象编程语言,...
这份"Java 最常见的 200+ 面试题汇总以及答案总结汇总.pdf"提供了全面的复习材料,涵盖了从基础到高级的各种主题。 首先,Java基础部分包括JDK和JRE的区别。JDK(Java Development Kit)是用于开发和运行Java程序的...
本资源包含"Java高级面试题整理(附答案).docx"和"最常见的Java面试题及答案汇总(一).docx"两份文档,旨在为求职者提供全面的准备材料。 1. **Java基础** - 数据类型:包括基本数据类型和引用数据类型的区别与...
Java 面试题汇总 在这篇文章中,我们将总结了 Java 面试中的 200 多个问题,涵盖了 Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、...
13. **性能优化**:理解JVM调优,包括类加载、内存配置、垃圾回收策略等。同时,如何通过代码优化提升程序性能也是面试的重要部分。 这份"125条常见的java面试笔试题大汇总"不仅包含了上述知识点,还可能包含更多...
本篇文章汇总了200道Java面试题,涵盖了从基础到高级的各个层面,包括Java基础、容器、多线程、反射、对象拷贝、Java Web、异常处理、网络编程、设计模式、SSM框架(Spring、Spring MVC)、Spring Boot/Spring Cloud...
本文档汇总了WebLogic Server在运行过程中可能会遇到的一些常见故障,包括内存溢出错误、服务器启动失败等问题,并给出了相应的日志报错、排查思路以及解决方案。 一、Server类故障 1.1 故障编号:...
11. **安全与性能**:面试者应了解如何防止SQL注入、XSS攻击,理解HTTPS的工作原理,以及性能调优的手段,如JVM内存模型、垃圾回收机制、线程池配置等。 以上就是Java面试中常见的知识点和解答方向,熟练掌握这些...
这份"常见面试题汇总(有选择看).zip"文件很可能是包含了一系列Java相关的面试题目,旨在帮助应聘者准备即将到来的技术面试。以下是一些可能涵盖的知识点,根据描述,我们将重点讨论Java编程的基础、进阶特性以及面试...
为了在激烈的竞争中脱颖而出,了解和掌握常见的Java面试笔试题至关重要。这里,我们汇总了125条关键知识点,帮助你全面准备Java面试。 1. **Java基础** - 了解Java的历史、特点和适用场景。 - 掌握Java的基本语法...
16. **JVM优化**:了解JVM的内存结构,理解类加载机制,学习JVM调优策略。 17. **Spring框架**:理解依赖注入和AOP的概念,知道如何配置和使用Spring Bean。 18. **MyBatis**:了解MyBatis的工作原理,知道如何...
【标题】:“Tomcat常见问题集锦(持续更新)” 在Java Web开发中,Tomcat作为最常用的开源应用服务器,其稳定性和性能是开发者关注的重点。这篇博客文章旨在收集和解决Tomcat在实际运行中遇到的各种问题,为开发者...
### Java常见问题集锦 #### 1. Java2 (JDK 1.2) 的环境配置 - **问题描述**:如何在不同操作系统上正确配置Java2(即JDK 1.2)的环境变量? - **解决方案**: - **Solaris平台**: - 设置`JAVA_HOME`为Java2的...
本篇将基于提供的"2023-Java面试资料汇总"来深入探讨Java相关的技术要点,包括JVM(Java虚拟机)、开源框架、集合、多线程、网络、微服务以及中间件等领域。 首先,我们来讨论JVM,它是Java程序运行的基础。JVM负责...