`

Java JVM虚拟机知识要点

    博客分类:
  • java
阅读更多
1、JVM虚拟机图解:




    对于搞开发的我们其实也是一样,现在流行的框架越来越多,封装的也越来越完善,各种框架可以搞定一切,几乎不用关注底层的实现,初级程序员只要熟悉基本的使用方法,便可以快速的开发上线;但对于高级程序员来讲,内功的修炼却越发的重要,比如算法、设计模式、底层原理等,只有把这些基础熟练之后,才能在开发过程中知其然知其所以然,出现问题时能快速定位到问题的本质。
    对于Java程序员来讲,spring全家桶几乎可以搞定一切,spring全家桶便是精妙的招式,jvm就是内功心法很重要的一块,线上出现性能问题,jvm调优更是不可回避的问题。因此JVM基础知识对于高级程序员的重要性不必言语.
    一.jvm体系总体分四大块:
        1.类的加载机制
        2.jvm内存结构
        3.GC算法 垃圾回收
        4.GC分析 命令调优
    二.类的加载机制
        1.什么是类的加载
        2.类的生命周期
        3.类加载器
        4.双亲委派模型
    三.什么是类的加载
        类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
    四.类的生命周期
        1.加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象
        2.连接,连接又包含三块内容:验证、准备、初始化。1)验证,文件格式、元数据、字节码、符号引用验证;2)准备,为类的静态变量分配内存,并将其初始化为默认值;3)解析,把类中的符号引用转换为直接引用
        3.初始化,为类的静态变量赋予正确的初始值
        4.使用,new出对象程序中使用
        5.卸载,执行垃圾回收
    五.类加载器
        1.启动类加载器:Bootstrap ClassLoader,负责加载存放在JDK\jre\lib(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库
        2.扩展类加载器:Extension ClassLoader,该加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载DK\jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。
        3.应用程序类加载器:Application ClassLoader,该类加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器
    六.类加载机制
        1.全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入
        2.父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类
        3.缓存机制,缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。这就是为什么修改了Class后,必须重启JVM,程序的修改才会生效
    七.jvm内存结构
        1.方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。
        2.Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
        3.方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
        4.程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。
        5.JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
        6.本地方法栈(Native Method Stacks),本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。
    八.对象分配规则
        1.对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。
        2.大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
        3.长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。
        4.动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
        5.空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。
    九.GC算法
    GC最基础的算法有三种:标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。
        1.标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。
        2.复制算法,“复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
        3.标记-压缩算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
        4.分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。
    十.垃圾回收器
        1.Serial收集器,串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。
        2.ParNew收集器,ParNew收集器其实就是Serial收集器的多线程版本。
        3.Parallel收集器,Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。
        4.Parallel Old 收集器,Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法
        5.CMS收集器,CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
        6.G1收集器,G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征
        7.GC算法和垃圾回收器算法图解以及更详细内容参考JVM(3):Java GC算法 垃圾收集器
    十一.GC日志分析
        摘录GC日志一部分(前部分为年轻代gc回收;后部分为full gc回收):
        2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]
        2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]
        通过上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen属于Parallel收集器。其中PSYoungGen表示gc回收前后年轻代的内存变化;ParOldGen表示gc回收前后老年代的内存变化;PSPermGen表示gc回收前后永久区的内存变化。young gc 主要是针对年轻代进行内存回收比较频繁,耗时短;full gc 会对整个堆内存进行回城,耗时长,因此一般尽量减少full gc的次数
    十二.调优命令
    Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo
        1.jps,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
        2.jstat,JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
        3.jmap,JVM Memory Map命令用于生成heap dump文件
        4.jhat,JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看
        5.jstack,用于生成java虚拟机当前时刻的线程快照。
        6.jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数。
        详细的命令使用参考这里JVM(4):Jvm调优-命令篇
    十三.调优工具
    常用调优工具分为两类,jdk自带监控工具:jconsole和jvisualvm,第三方有:MAT(Memory Analyzer Tool)、GChisto。
        1.jconsole,Java Monitoring and Management Console是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控
        2.jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。
        3.MAT,Memory Analyzer Tool,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗
        4.GChisto,一款专业分析gc日志的工具
  • 大小: 31.7 KB
分享到:
评论

相关推荐

    java虚拟机规范

    根据给定的文件标题“Java虚拟机规范”及其描述“Java虚拟机规范,了解虚拟机原理”,我们可以深入了解Java虚拟机(JVM)的核心概念和技术细节。虽然提供的部分内容未能直接展示文本内容,但从标题和描述中可以推断出...

    Java所有知识要点

    ### Java所有知识要点 #### 一、Java简介与开发环境 **Java** 是一种广泛使用的高级编程语言,它由 Sun Microsystems 公司于1995年推出,并最终被 Oracle 公司收购。Java 设计时考虑了面向对象、跨平台、安全性等...

    《Java语言知识要点回顾》.pdf

    《Java语言知识要点回顾》是一份针对Java编程的复习资料,主要涵盖了Java程序设计的基础概念,包括Java程序的分类、构成、开发流程以及标识符的命名规则。以下是对这些知识点的详细阐述: 1. **Java程序类型**: -...

    JVM面试要点

    JVM 面试要点是 Java 程序员必备的知识之一,它涵盖了 JVM 的各个方面,包括类加载机制、内存结构、垃圾回收算法等。下面是 JVM 面试要点总结: 类加载机制 类加载机制是 JVM 的一个重要组件,它负责将类的 .class...

    Java虚拟机规范(Java+SE+7).pdf

    ### Java虚拟机规范(Java SE 7)关键知识点解析 #### 一、概述 《Java虚拟机规范(Java SE 7)》是一本详细介绍Java虚拟机(JVM)工作原理的重要书籍,由Tim Lindholm、Frank Yellin、Gilad Bracha、Alex Buckley等...

    YJVM—一种运行在嵌入式Linux内核中的Java虚拟机的设计与实现

    YJVM(Yet another JVM)是一种特别设计并实现运行在嵌入式Linux内核中的Java虚拟机,它克服了传统虚拟机在嵌入式系统中的一些限制。YJVM设计的核心目标是提供一个更加高效、资源占用更少的Java运行环境。YJVM实现了...

    Java虚拟机规范

    以上内容仅涵盖了《Java虚拟机规范(Java SE 7)》的部分要点,实际规范包含更多细节,如内存溢出错误、并发机制、类文件格式等。深入理解和掌握JVM规范对于提升Java程序性能、调试问题以及优化代码具有重要意义。

    Java各知识点详细总结

    本篇文章总结了Java的基础知识点,涵盖了Java的历史、技术架构、环境配置、基本语法等内容,旨在帮助初学者快速掌握Java的核心概念和技术要点。对于更高级的概念和进阶技术,建议进一步深入学习相关的文档和资源。

    java重要知识点总结

    接着,字节码由 Java 虚拟机(JVM)解释执行,这意味着 Java 程序可以在任何安装了 JVM 的平台上运行而无需重新编译。这种方式提高了 Java 程序的跨平台能力,并且 JVM 还提供了自动内存管理和安全性的保障。 #### ...

    Java虚拟机学习和总结(1&2)

    本总结将深入探讨Java虚拟机的学习要点,主要分为三个部分:垃圾回收、运行时数据区域和对象。 首先,我们来关注垃圾回收。垃圾回收是Java的一大特色,它自动管理内存,避免了程序员手动释放内存可能导致的错误。...

    The Java Virtual Machine Specification, Java SE 8 Edition

    本书详细介绍了Java虚拟机的工作原理和技术细节,覆盖了从类文件结构到Java虚拟机实现的关键概念和技术要点。以下是一些关键章节的知识点: 1. **类文件格式**:介绍了Java类文件的结构,包括常量池、字段表、方法...

    java基础知识总结(经典).pdf

    2. **JRE**:Java运行时环境,包括Java虚拟机(JVM)和Java标准类库,用于运行Java程序。 #### 三、环境变量配置 为了能够在任何目录下使用JDK提供的工具,需要配置环境变量。这可以通过两种方式进行: 1. **永久...

    java通观记忆 极品要点

    ### Java通观记忆极品要点解析 #### 概述 本文档旨在提炼并总结Java学习中的核心知识点,通过简明扼要的方式帮助读者更好地理解和掌握Java编程语言的基础与进阶内容。文档涵盖了Java环境配置、基本语法、类和对象等...

    Java面试题合集最新版2024.zip

    Java面试通常涵盖多个方面,包括Java基础知识、编程技能、问题解决能力,以及对Java生态系统和相关...JVM与性能调优:对Java虚拟机(JVM)有一定了解,包括内存管理、垃圾回收等方面,并知道如何进行基本的性能调优。

    干货!资深java工程师面试要点大全+一年整理.pdf

    Java的JVM调优也是一个高阶知识点,它通常涉及垃圾回收(GC)、内存泄漏的分析以及性能监控等。掌握JVM调优技巧可以确保Java应用程序在高负载下依然能稳定运行。 在安全方面,SQL注入是需要掌握的知识点。为了防止...

    java葵花宝典,编程思想,并发,虚拟机合集

    1. **JAVA精华.doc**:这个文档可能包含了Java语言的精华要点,包括但不限于基础语法、类与对象、异常处理、集合框架、IO流、网络编程等关键知识点。这些内容对于初学者快速掌握Java编程基础至关重要。 2. **深入...

    图灵书籍(Scala程序设计(第2版).pdf+Scala程序设计-JAVA虚拟机多核编程实战.pdf)

    标题提及了两本书籍资源——"Scala程序设计(第2版).pdf"和"Scala程序设计-JAVA虚拟机多核编程实战.pdf",这表明主题聚焦在Scala编程语言以及其与Java虚拟机(JVM)多核编程的结合应用上。描述简单明了,确认了这两...

    关于java考试的要点

    根据提供的文件信息,我们可以整理出以下关于Java考试的要点及相关知识点: ### Java考试要点概览 #### 一、Java的历史与发展 - **起源**: Java语言最初由Sun Microsystems公司于1991年开始开发,最初命名为“Oak...

Global site tag (gtag.js) - Google Analytics