java进阶五(jvm)

一、JVM
    1、定义
       (1)、概念
            是运行在你系统上的另一个进程,也需要内存来完成它的运 行时操作。
        
        JVM本身是硬件的一层软件抽象,在这之上才能够运行Java程序,也才有了我们所说的平台独立性以及WORA(一次编写,处处运 行)

       (2)、种类
            Oralce-Sun Hotspot

            Oralce JRockit

            IBM J9

            Taobao JVM(淘宝)
        
            注: 正常使用oracle的jdk,所以就是 Hotspot Jvm, 以下内容 只讲 Hotspot Jvm

       (3)、组成(一种说法)
            堆

            方法区(非堆)

            JVM栈

            本地栈

            PC寄存器

    2、堆                            --->            jvm参数:-Xms和-Xmx
       (1)、作用
            a、堆是实例化的对象所存储地方

            b、由所有线程共享

            c、当堆耗尽的时候,JVM会抛出java.lang.OutOfMemoryError 异常

       (2)、组成
        a、Eden区                        --->            jvm参数:-XX:NewSize和-XX:MaxNewSize
           主要是用来存放新生的对象,由新生代GC(垃圾回收器)进行清理

        b、两个Survivor区                    --->            jvm参数:-XX:SurvivorRatio
           历经了Eden区的垃圾回收仍能存活下来的依旧存在引用的对象

        c、老年代(old)
           历经了Eden区和Survivor区的多次GC后仍然存活下来的对象( 一直存在引用),由老年代GC(major GC)进行清理

    3、方法区(又称 非堆区域)
       (1)、作用
            a、用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码等信息
        
            b、由所有线程共享

       (2)、组成
        a、持久代(permgen)                    --->            jvm参数:-XX:PermSize及 -XX:MaxPermSize
           存储包括类定义,结构,字段,方法(数据及代码)以及常量在内的类相关数据。

           注: 在很多虚拟机相关文档中,也将其称之为"永久域"(permanent heap),作为堆空间的一部分存在。(个人定位: 此说法不够精准)
           
               JDK8 HotSpot JVM 移除永久域,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace),由参数 -XX:MetaspaceSize和-XX:MaxMetaspaceSize 指定,如无指定则动态调整。
        
        b、代码缓存(code cache)
           用来存储编译后的代码,编译后的代码就是本地代码(硬件相关的),它是由JIT(Just In Time)编译器生成的。

       注: 永久域其实是一个独立域并且不认为是堆的一部分。

    4、JVM栈                            --->            jvm参数:-Xss
       (1)、作用
            a、和Java类中的方法密切相关

            b、存储局部变量以及方法调用的中间结果及返回值

            c、Java中的每个线程都有自己专属的栈,这个栈是别的线程无法访问的。

    5、本地栈
       (1)、作用
            a、用于本地方法(非Java代码)

            b、按线程分配

    6、PC寄存器
       (1)、作用
            a、特定线程的程序计数器

            b、包含JVM正在执行的指令的地址(如果是本地方法的话它的值则未定义)

二、Jvm垃圾收集器
    1、基础概念
       (1)、串行 (Sequential)
            指两个或者多个事件顺序执行

       (2)、并发 (Concurrent)
            指两个或多个事件在同一时间间隔内发生

        a、在操作系统中
           指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
           ①程序与计算不再一一对应,一个程序副本可以有多个计算

           ②并发程序之间有相互制约关系,直接制约体现为一个程序需要另一个程序的计算结果,间接制约体现为多个程序竞争某一资源,如处理机、缓冲区等。

           ③并发程序在执行中是走走停停,断续推进的。

        b、在网络服务器上
           并发是指同一时刻能处理的连接数

       (3)、并行 (parallel)
            指两个或者多个事件在同一时刻发生

       (4)、分布式(distributed)
            分布式在并行处理的基础上,强调任务正在执行的物理设备,如处理器、内存等等硬件,在物理上是分开的。

       (5)、区别
        并发和并行从宏观上来讲都是同时处理多路请求的概念,更加强调多个任务同时在运行。

        并发>并行>分布式

        并发在单核和多核都可存在,就是同一时间有多个可以执行的进程

        并行是指同一时间多个进程在微观上都在真正的执行,这就只有在多核的情况下了。

    2、分类
       (1)、串行
            处理小型数据,jdk1.4之前默认使用

       (2)、并发

       (3)、并行
            1.5和1.5之后使用

三、JVM主要参数的作用
    1、堆设置
       -Xms                    --->            设置jvm内存的初始大小                        --->        -Xms512m (代表jvm最少用 512m内存)

       -Xmx                    --->            设置jvm内存(初始堆)的最大值                    --->        一般为服务器的3/4内存量,不应该超过物理内存的90%。

       -Xmn                    --->            设置年轻代的大小(只针对 jdk1.4,后被废弃)            --->        Sun官方推荐配置为整个堆的3/8。

       -Xss                    --->            设置每个线程的堆栈大小                        --->        在相同物理内存下,减小这个值能生成更多的线程(默认512k)

       -XX:NewSize                --->            设置年轻代的初始值

       -XX:MaxNewSize                --->            设置年轻代的最大值

       -XX:PermSize                --->            设置永久域的初始值

       -XX:MaxPermSize                --->            设置永久域的最大值

       -XX:NewRatio                --->            设置年轻代与老年代之比                        --->        -XX:NewRatio = 4就表示年轻代与老年代之比为1:4

       -XX:SurvivorRatio            --->            设置年轻代中Eden区与两个Survivor区的比值。

    2、收集器设置
       -XX:+UseSerialGC                --->            设置串行收集器

       -XX:+UseParallelGC            --->            设置并行收集器(仅对年轻代有效)

       -XX:+UseParallelOldGC            --->            设置并行老年代收集器(JDK6.0起支持)

       -XX:+UseConcMarkSweepGC            --->            设置并发收集器

    3、垃圾回收统计信息
       -XX:+PrintGC

       -XX:+PrintGCDetails

       -XX:+PrintGCTimeStamps

       -Xloggc:filename

    4、并发收集器设置
       -XX:+CMSIncrementalMode            --->            设置为增量模式。适用於单CPU情况。

       -XX:+UseCMSCompactAtFullCollection     --->            设置运行多少次GC以后对内存空间进行压缩、整理。
                                        注: 并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。

       -XX:+UseCMSCompactAtFullCollection     --->            打开对老年代的压缩。可能会影响性能,但是可以消除碎片

       -XX:ParallelGCThreads             --->            设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数

    5、并行收集器设置
       -XX:ParallelGCThreads            --->            设置并行收集器收集时使用的CPU数。并行收集线程数。

       -XX:MaxGCPauseMillis            --->            设置并行收集最大暂停时间

       -XX:GCTimeRatio                --->            设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

    6、jboss配置示例
       (1)、生产环境8G内存
            if [ "x$JAVA_OPTS" = "x" ]; then   
               JAVA_OPTS="-Xss128k -Xms6000m -Xmx6000m -XX:MaxNewSize=512m -XX:MaxPermSize=512M -XX:+UseParallelGC -XX:ParallelGCThreads=16
              -XX:+UseParallelOldGC -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"   
            fi   
       
       (2)、生产环境4G内存
            if [ "x$JAVA_OPTS" = "x" ]; then   
               JAVA_OPTS="-Xss128k -Xms3000m -Xmx3000m -XX:MaxNewSize=256m -XX:MaxPermSize=256m -XX:+UseParallelGC -XX:ParallelGCThreads=16
              -XX:+UseParallelOldGC -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"   
            fi   

三、JVM常见错误
    1、java.lang.OutOfMemoryError
       (1)、原因
            这个主要就是JVM参数没有配好引起的

       (2)、错误类型
        a、java.lang.OutOfMemoryError: Java heap space
           是有关堆内存的内存溢出,可以同过配置-Xms和-Xmx参数来设置。

        b、java.lang.OutOfMemoryError: PermGen space
           是有关永久域的内存溢出,可以通过配置-XX:MaxPermSize来设置。

    2、示例
        JAVA_OPTS="-Xms256m -Xmx2048m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=128m -XX:MaxPermSize=256m
    -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -Djboss.platform.mbeanserver"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章