一.JVM的三大组成部分
- VM Runtime
- GC
- JIT
VM Runtime
(一).命令行选项 Command Line Options
命令行选项分为三种
- 标准选项。在JVM规范中定义的选项,所有虚拟机实现都必须遵循。
- 非标准选项(非标准)。 以
-X
开头的参数。 - 开发者选型(非标准)。 以
-XX
开头的参数。
对于开发者选项,可以通过 +
或者-
号来设置布尔选项。
如-XX:+AggressiveOpts
,将AggressiveOpts设为true 。
简单的参数介绍:
1. -XX:-DisableExplicitGC 禁用显示GC
2. -XX:MaxNewSize=size 新生代占整个堆内存的大小
3. `-XX:ErrorFile=./hs_err_pid<pid>.log` JVM crash时,将错误信息打印到某个文件
4. -XX:-PrintGCDetails 开启GC细节
5. -XX:-TraceClassLoading class loader装载细节
(二).VM 的生命周期 VM Lifecycle
- 解析命令行参数
- 指定堆大小和JIT类型
- 指定环境变量,如LD_LIBRARY_PATH,CLASS_PATH
- 如果命令行参数中没有指定main-class,则从Jar包中的manifest中获取。
- 使用JNI_CreateJavaVM方法创建JVM.会依次加载各类依赖到的库。
- 加载main class
- 使用CallStaticVoidMain方法执行main方法。
- 当main执行完毕后,使用DetachCurrentThread来介绍线程
- 调用DestroryJavaVM来结束JVM。先会调用
java.lang.Shutdown.shutdown()
,触发一些钩子和释放函数。
JAVA类加载,复习下JVM规范。
GC
HotSpot VM使用了分代回收的机制,这个机制建立在两个观察结果之上:
- 大部分对象很快的会变成不可达
- 很少存在老对象对新对象的引用
因此内存被分成了几块区域:年轻代、年老代和永久区。
内存划分:
####(一).年轻代 其中年轻代被分为:Eden和两块survivor区域。发生在年轻代的GC叫做young gc或者minor gc。
因为年轻代比较小,因此young gc通常比较快。
通常年轻代使用的是copy方式,即ygc时,从eden和其中一个survivor的存活对象拷贝到另外个survivor区域。
如果此时eden中存活的对象过大,导致另外个survivor区域放不下,那就直接放到old区,这被成为premature promotion,过早提升。
如果old区还是不够,则会先出发full gc 后再出发ygc。
Card Table
需要注意的是,为了判断年轻代的对象是否存活,需要观察下是否有从old去到young区的引用。
如果直接扫描old区将非常的耗费,所以会有个一个叫做Card Table的方式。
首先将年老带按照512个字节的大小分成若干份,然后有个叫做card table的数组,如果存在对young区的引用,则将这个下标标记为dirty。
快速的分配对象:TLAB
在分配对象的时候,需要保证线程安全,避免多个对象分配到同个内存区域。
而此时必须加锁,为了避免此成为瓶颈。
便产生了Thread Local Allocation Buffers的概念,线程可以在自己的内存空间内(预先分配给线程的地址空间)分配对象,而不需要加锁,以此来增加吞吐量。
如果对象分配的内存大小超过了TLAB ,那么就必须通过加锁来同步内存地址空间的分配了。
(二).年老代
年老代放的是生命周期相对比较长的对象。
(三).永久区
永久区放的通常是Class metadata,interned strings等
GC的策略
####(一).串行GC 每次GCd的时候,将停止整个应用(Stop World)进行垃圾啊回收。
Mark Compact 收集器将不引用的对象做标记,回收后将剩余对象像对顶压缩,这样可以腾出连续的内存区域。Mark Compact可以用于ygc也可以用于fgc。
串行GC适合用于Client模式。
(二).并行GC
通过多线程的方式,避免因为GC造成的等待。
(三).CMS
Concurrent Mark Sweap 并发标记清除。
CMS分为初始化标记(initial mark)=》并发标记=》重新标记(remark)=》并发清除(concurrent sweap)等几个阶段。
CMS并不是没有暂停,而是只有两次很小的暂停,初始化标记和重新标记。
其中并发标记是指在CMS开始期间,应用有更新的部分需要从新标记,此时可以起多个线程标记。Remark阶段也可以起多个线程同时标记。
并发清除的并发是指垃圾回收和应用同时进行。
注意两个并发的区别。
CMS并不会进行碎片压缩。
(四).Garbage First(G1)
G1垃圾回收将内存切割成一小块一小块的区域,它是下一代的垃圾回收器。
G1意味着可以使用不连续的区域组成年老代和年轻代,也以为着可以动态调整年轻代大小。
比起CMS,优势如下:
- 不再具有内存碎片
- 可以精确控制停顿时间
ps:以上部分需要深入了解下,尤其是G1。
参考资料
http://www.iteye.com/topic/473874
http://blog.csdn.net/java2000_wl/article/details/8030172
http://blog.csdn.net/chjttony/article/details/7883748
相关推荐
Chapter 3 JVM Overview Chapter 4 JVM Performance Monitoring Chapter 5 Java Application Profiling Chapter 6 Java Application Profiling Tips and Tricks Chapter 7 Tuning the JVM, Step by Step Chapter 8 ...
1. **-overview**: 指定一个HTML文件,用于概述整个文档集。 以上参数的合理运用,能够显著提升Java应用程序的开发效率和运行性能,同时也为软件的维护和升级提供了便利。理解和掌握这些参数的含义及用法,是每个...
4. **分析内存状态**:MAT提供了多种分析视图,如“Overview”、“Leak Suspects”和“Dominator Tree”。这些视图可以帮助我们发现内存泄漏的线索,如过大对象、引用链过长等。 5. **查找问题**:“Leak Suspects...
Pub Date: 2018 Learn how Java principles and technology make the best use of modern hardware and operating ...Learn performance aspects of the Java Collections API and get an overview of Java concurrency
"overview-frame.rar_overview" 提供了一个对Java架构的全面概览,尤其对于那些希望深入了解其核心概念和组织结构的开发者而言,这是一份非常有价值的学习资源。 在Java架构中,最基础的是JVM(Java Virtual ...
Overview 创建 JVM 上的语言是指如何在 Java虚拟机(JVM)上实现一个新的编程语言。在本文档中,我们将通过 JRuby 和 Ioke 两个案例研究,来了解创建 JVM 上的语言的过程。 为什么选择 JVM? JVM 提供了许多优点...
OverView This is a tool library for Kotlin to use java reflect APIs in Kotlin simply method.It can modify or read the top level private visible property value in Kotlin way. Note: This tools only ...
比如,"Overview"视图提供了对整个堆的鸟瞰,"Leak Suspects"报告则提供了一套初步的诊断,"Dominator Tree"视图则能帮助我们理解对象间的依赖关系。通过这些工具,开发者可以深入到内存管理的细节,有效地定位和...
这是通过Java虚拟机(JVM)实现的,JVM将Java字节码转换为特定平台的机器代码,从而确保了程序的跨平台兼容性。 #### 完全面向对象 Java是一种纯粹的面向对象编程语言,它简化了C++的复杂性,提供了类、对象、继承...
2. VisualVM提供了丰富的视图,如"Overview"(概览)、"Threads"(线程)、"Memory"(内存)、"Profiler"(性能分析器)等,可以帮助你实时查看和分析JVM的状态。 3. 你可以通过这些视图监控CPU使用率、内存分配、...
在“ABAP Overview-Programming Techniques”这个主题中,我们将深入探讨ABAP编程的一些核心技术和方法。 1. **数据类型**:ABAP提供了丰富的内置数据类型,包括基本类型(如I(整数),N(数值),D(日期),T...
Java RMI(Remote Method Invocation)是Java平台中用于实现分布式计算的一种机制,它允许一个Java对象调用位于另一个JVM(Java Virtual Machine)上的对象的方法,即使这两个对象位于不同的物理设备上。EJB...
- **Overview**: This part explores alternative languages that run on the JVM, highlighting their unique features and use cases. - **Languages Discussed**: - **Groovy**: Overview of Groovy, a dynamic ...
例如,从C++编译到Sparc汇编、C++到C、Java到JVM字节码等。编译技术的应用非常广泛,包括但不限于:代码生成、优化、文本格式化、解释器、自动并行化或向量化、调试辅助工具、性能监控工具等。 在众多编译器框架中...
STW 是 JVM 的一种全停顿垃圾回收机制,可能造成短暂的服务暂停,Cassandra 通过优化 GC 参数来减少其影响。 5. **Shared-Nothing 架构**:Cassandra 实现了 Shared-Nothing 架构,每个节点都拥有独立的资源,无需...
4. **数据分析**:在JMC的主界面,用户可以选择不同的视图进行分析,如"Overview"、"Threads"、"Garbage Collection"等。 5. **问题诊断**:根据监控数据,通过分析器找出潜在的问题,如长时间运行的线程、频繁的...
- **JRockit JVM**:高性能的Java虚拟机。 - **Coherence EE**:内存数据网格解决方案。 - **WebLogic Real Time**:实时计算引擎。 - **Databases and Mainframes**:支持多种数据库和大型机系统。 - **Web ...
这个变量告诉Java虚拟机(JVM)在哪里查找类库。 完成环境变量的配置后,可以通过简单的“javac”和“java”命令来测试Java是否安装成功。编写一个名为“HelloWorld”的简单程序,如下所示: ```java // Hello...
"Overview"视图可以显示最大的对象和类,以及它们的大小占比,帮助定位问题。 4. **支配树分析**:MAT的"Dominator Tree"视图展示了对象之间的引用关系,通过这个视图可以发现哪些对象占据了大量内存,并追踪到其...
6. **IBM 虚拟机 (JVM)**:作为 WAS V8 的基础,提供强大的 Java 执行环境。 WAS V8 作为整个 WebSphere 产品组合的核心,不仅自身功能强大,还为其他产品如 IBM Workload Deployer、WebSphere Virtual Enterprise...