• JVM优化之JVM运行参数和内存模型


    Jvm优化
    了解下我们为什么要学习 JVM优化
    掌握 jvm的运行参数以及参数的设置
    掌握 jvm的内存模型(堆内存)
    掌握 jamp命令的使用以及通过MAT工具进行分析
    掌握定位分析内存溢出的方法


    为什么要学习JVM优化
    JVM被称为Java虚拟机,所有Java程序的运行都依赖于JVM
    1.应用运行一段时间后突然停止,程序没有响应
    2.服务器的CPU突然升高
    3.在多线程应用下,如何去分配线程数量
    。。。。。。。。。。。。。。。。。。。。。。。
    优化JVM目的是为了让程序运行的更快

    JVM运行参数

    合理的调整JVM参数,也能够加快运行速度
    标准参数

    无论如何更新迭代版本,标准参数不会进行更改
    -version
    -help
    -X参数,非标准参数:在更新迭代过程中,有一些参数信息是变化的
    -Xms 初始内存
    -Xmx 最大内存
    -XX参数,非标准参数:专门做优化和debug用的,使用率比较高
    -XX:+UseSerialGC

    标准参数:一般来说标准参数比较稳定,我们可以使用java -help来查看所有的标准参数
    java -help查看所有的标准参数

     


    java -version查看版本

     


    java -D设置系统参数

     

    设置系统参数

    1).使用idea中的application中vm options设置参数

     

    2).使用命令创建参数

     


    -server和-client有什么区别
    ServerVM模式当中:

    初始堆空间会大一些,

    默认使用的是并行垃圾回收器,

    启动慢,运行快


    ClientVM模式当中:

    初始堆空间相对小一些,使用串行垃圾回收期,

    目的是为了让JVM启动速度更快一些,运行就比ServerVM慢一些

    JVM运行的时候是根据操作系统选择运行的模式
    如果是32位的window操作系统,默认使用的client
    如果在其他系统上,只要有2G以上的内存以及至少两个以上的CPU那么默认使用Server模式
    在64位操作系统当中只有Server模式,不支持Client模式


    -X非标准参数
    在不同版本的JVM当中,参数可能有所不同,通过java -X查看非标准参数列表

    1.非标准参数列表的三种模式
    -Xint:解释模式(interpreted model),强制要求JVM执行所有的字节码,效率低
    -Xcomp:编译模式,与-Xint相反,第一次会将所有的字节码编译成本地的代码,第一次运行慢,后续运行快
    万一我们有一些字节码只需要编译一次
    -Xmixed:混合模式,就是解释模式和编译模式混合使用,有jvm自身决定应该采用哪种模式,jvm默认的默认

    -XX参数:也是非标准参数,主要用于JVM调优和Debug操作
    -XX参数有两种模式:
    1.boolean类型 +代表true,代表应用该参数 -代表false代表不应用该参数
    2.非boolean模式
    -XX:NewRatio=1
    3.默认情况下没有禁用手动调用GC,也就是说程序员可以手动调用,手动回收
    禁用手动调用垃圾回收器,程序员手动调用gc是无效的 java -showversion -XX:+DisableExplicitGC xxx

    -Xms -Xmx参数调整堆内存大小
    -Xms代表初始的堆内存大小 -Xmx代表最大堆内存大小
    java -Xms512m -Xmx1024m JVMTest


    -Xms512m等价于-XX:InitialHeapSize
    -Xmx2018m等价于-XX:MaxHeapSize

    查看Java程序运行时使用的参数
    java -XX:+PrintFlagsFinal JVMTest,查看过程中发现有=和:=,=代表默认值 :=代表修改过的值
    更改参数信息:java -XX:+PrintFlagsFinal -XX:+VerifySharedSpaces -version


    查看当前正在运行的Java的参数
    jps命令查看当前所有正在运行Java进程
    jps -l 查看当前所有正在运行Java进程详细信息
    查看正在运行的Java进程信息jinfo -flags 进程id
    查看进程的参数信息:jinfo -flag MaxHeapSize 6752

    内存模型
    jdk1.7的内存模型
    1.年轻代:新创建的对象,比如new的对象,在对象比较小会放在年轻代当中存储
    2.年老代:如果当前创建对象比较大,不经过年轻代直接放在年老代当中,年轻代通过多次垃圾回收期没有回收掉的对象也会放在年老代当中
    3.永久代:比如我们部署一个程序到Tomcat当中,Tomcat启动的时候要去加载所有的Class,以及Method,以及Field都会存放在永久代当中

    jdk1.8的内存模型
    1.年轻代:新创建的对象,比如new的对象,在对象比较小会放在年轻代当中存储
    2.年老代:如果当前创建对象比较大,不经过年轻代直接放在年老代当中,年轻代通过多次垃圾回收期没有回收掉的对象也会放在年老代当中
    3.MetaSpace元数据空间



    1.8版本以后废除了永久代,因为要融合JRocket VM虚拟机使用,JRocket VM虚拟机不支持永久代,所以废除了

    现实使用中,由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen。

    基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。

    通过jstat命令进行查看堆内存使用情况

    使用idea启动一个Tomcat

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:

    jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

    查看class加载统计

     

     查看编译统计

     

    垃圾回收统计

     

     

  • 相关阅读:
    课程教学网站(大三上课设)
    mybatis+servlet
    第一个struct2(Hello_World)
    servlet入门
    mybatis入门项目
    XML
    状态模式的介绍及状态机模型的函数库javascript-state-machine的用法和源码解析
    10个JavaScript难点
    markdown基本语法
    Mac OSX 平台安装 MongoDB
  • 原文地址:https://www.cnblogs.com/wishsaber/p/12404178.html
Copyright © 2020-2023  润新知