jvm

相关博客:http://wangyapu.com/2018/03/15/sysetem_optimize/

oracle官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/toc.html

 

 

 

jvm参数类型:
    1:标准参数:jvm的各个版本基本不变,标准参数中包括功能和输出的参数都是很稳定的,很可能在将来的 JVM 版本中不会改变。你可以用 java 命令(或者是用 java -help)检索出所有标准参数
    -server and -client

    有两种类型的 HotSpot JVM,即“server” 和“client”。服务端的 VM 中的默认为堆提供了一个更大的空间以及一个并行的垃圾收集器,并且在运行时可以更大程度地优化代码。
    客户端的 VM 更加保守一些(校对注:这里作者指客户端虚拟机有较小的默认堆大小),这样可以缩短 JVM 的启动时间和占用更少的内存。
    有一个叫”JVM 功效学” 的概念,它会在 JVM 启动的时候根据可用的硬件和操作系统来自动的选择 JVM 的类型。具体的标准可以在这里找到。
    从标准表中,我们可以看到客户端的 VM 只在 32 位系统中可用。

    如果我们不喜欢预选(校对注:指 JVM 自动选择的 JVM 类型)的 JVM,我们可以使用 - server 和 - client 参数来设置使用服务端或客户端的 VM。
    虽然当初服务端 VM 的目标是长时间运行的服务进程,但是现在看来,在运行独立应用程序时它比客户端 VM 有更出色的性能。当应用的性能非常重要时,我推荐使用 - server 参数来选择服务端 VM。


    2:X参数 (-Xint:解释执行;-Xcomp:第一次使用就编译成本地代码;-Xmixed:混合模式,jvm自己决定是否编译成本地代码)jvm的各个版本参数会变,变动比较小,
       X参数,非标准化的参数在将来的版本中可能会改变。所有的这类参数都以-cX 开始,并且可以用 java -X 来检索。注意,不能保证所有参数都可以被检索出来,其中就没有 - Xcomp
        [@xpMac:~]$ java -X
            -Xmixed           混合模式执行 (默认)
            -Xint             仅解释模式执行
            -Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>
                              设置搜索路径以引导类和资源
            -Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>
                              附加在引导类路径末尾
            -Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>
                              置于引导类路径之前
            -Xdiag            显示附加诊断消息
            -Xnoclassgc       禁用类垃圾收集
            -Xincgc           启用增量垃圾收集
            -Xloggc:<file>    将 GC 状态记录在文件中 (带时间戳)
            -Xbatch           禁用后台编译
            -Xms<size>        设置初始 Java 堆大小
            -Xmx<size>        设置最大 Java 堆大小
            -Xss<size>        设置 Java 线程堆栈大小
            -Xprof            输出 cpu 配置文件数据
            -Xfuture          启用最严格的检查, 预期将来的默认值
            -Xrs              减少 Java/VM 对操作系统信号的使用 (请参阅文档)
            -Xcheck:jni       对 JNI 函数执行其他检查
            -Xshare:off       不尝试使用共享类数据
            -Xshare:auto      在可能的情况下使用共享类数据 (默认)
            -Xshare:on        要求使用共享类数据, 否则将失败。
            -XshowSettings    显示所有设置并继续
            -XshowSettings:all
                              显示所有设置并继续
            -XshowSettings:vm 显示所有与 vm 相关的设置并继续
            -XshowSettings:properties
                              显示所有属性设置并继续
            -XshowSettings:locale
                              显示所有与区域设置相关的设置并继续

        -X 选项是非标准选项, 如有更改, 恕不另行通知。


        以下选项为 Mac OS X 特定的选项:
            -XstartOnFirstThread
                              在第一个 (AppKit) 线程上运行 main() 方法
            -Xdock:name=<应用程序名称>"
                              覆盖停靠栏中显示的默认应用程序名称
            -Xdock:icon=<图标文件的路径>
                              覆盖停靠栏中显示的默认图标

        例子:
        [@xpMac:~]$ java -version
        java version "1.8.0_131"
        Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
        Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) --默认是混合模式,我强烈建议大家使用 JVM 的默认设置,让 JIT 编译器充分发挥其动态潜力,毕竟 JIT 编译器是组成 JVM 最重要的组件之一

        [@xpMac:~]$ java -Xint -version
        java version "1.8.0_131"
        Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
        Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, interpreted mode) --解释模式,在解释模式 (interpreted mode) 下,-Xint 标记会强制 JVM 执行所有的字节码,当然这会降低运行速度,通常低 10 倍或更多


        [@xpMac:~]$ java -Xcomp -version
        java version "1.8.0_131"
        Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
        Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, compiled mode) --编译模式,JVM 在第一次使用时会把所有的字节码编译成本地代码,从而带来最大程度的优化,因为这完全绕开了缓慢的解释器。然而,很多应用在使用 - Xcomp 也会有一些性能损失,当然这比使用 - Xint 损失的少,原因是 - xcomp 没有让 JVM 启用 JIT 编译器的全部功能


    3:XX参数,非标准化参数,不稳定,主要用于jvm调优和debug
        XX参数分类:Boolean类型 格式:-XX:[+-]<name>表示启用或者禁用name属性
                                  -XX:+UseConcMarkSweepGC        
                                  -XX:+UseG1GC
                  非Boolean类型:key value类型,格式:-XX<name>=<value>,name表示属性,value表示值
                  -XX:MaxGCPauseMills=500
                  -XX:GCTimeRatio=19

                  -Xmx -Xms
                  -Xms等价与-XX:InitialHeapSize ,初始化堆大小
                  -Xmx等价与-XX:MaxHeapSize , 最大堆大小
                  -Xss等价- -XX:ThreadStackSize, 线程堆栈大小

        在 JVM 启动后,在命令行中可以输出所有 XX 参数和值:

        [@xpMac:~]$ java -XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial
        [Global flags]
            uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}
            uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}
            uintx AdaptiveSizePausePolicy                   = 0                                   {product}
            uintx AdaptiveSizePolicyCollectionCostMargin    = 50                                  {product}
            uintx AdaptiveSizePolicyInitializingSteps       = 20                                  {product}
            uintx AdaptiveSizePolicyOutputInterval          = 0                                   {product}
            uintx AdaptiveSizePolicyWeight                  = 10                                  {product}
            uintx AdaptiveSizeThroughPutPolicy              = 0                                   {product}
            uintx AdaptiveTimeWeight                        = 25                                  {product}
             bool AdjustConcurrency                         = false                               {product}
             bool AggressiveOpts                            = false                               {product}
             intx AliasLevel                                = 3                                   {C2 product}
             bool AlignVector                               = false                               {C2 product}
             intx AllocateInstancePrefetchLines             = 1                                   {product}
             intx AllocatePrefetchDistance                  = 192                                 {product}
             intx AllocatePrefetchInstr                     = 3                                   {product}
             intx AllocatePrefetchLines                     = 4                                   {product}
             intx AllocatePrefetchStepSize                  = 64                                  {product}
             intx AllocatePrefetchStyle                     = 1                                   {product}
             bool AllowJNIEnvProxy                          = false                               {product}
             bool AllowNonVirtualCalls                      = false                               {product}
             bool AllowParallelDefineClass                  = false                               {product}
            .........................省略
            表格的每一行包括五列,来表示一个 XX 参数。第一列表示参数的数据类型,第二列是名称,第四列为值,第五列是参数的类别。第三列”=” 表示第四列是参数的默认值,而“:=” 表明了参数被用户或者 JVM 赋值了。
            通过选项-XX:+PrintFlagsFinal,查看最终生成的虚拟机配置参数,可以列出所有的JVM flag,而其中的标注为manageable 的flag则是值得我们关注的部分。这些flag可通过JDK management interface(-XX:+PrintFlagsFinal)动态修改
            := 意味着值是被修改的, = 表示默认值,其他列对使用者意义不大。


            XX:+PrintFlagsInitial:查看初始值

            


        [@xpMac:~]$ java -XX:+PrintFlagsFinal -version|grep manageable
         intx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}
         intx CMSTriggerInterval                        = -1                                  {manageable}
         intx CMSWaitDuration                           = 2000                                {manageable}
         bool HeapDumpAfterFullGC                       = false                               {manageable}
         bool HeapDumpBeforeFullGC                      = false                               {manageable}
         bool HeapDumpOnOutOfMemoryError                = false                               {manageable}
        ccstr HeapDumpPath                              =                                     {manageable}
        uintx MaxHeapFreeRatio                          = 100                                 {manageable}
        uintx MinHeapFreeRatio                          = 0                                   {manageable}
         bool PrintClassHistogram                       = false                               {manageable}
         bool PrintClassHistogramAfterFullGC            = false                               {manageable}
         bool PrintClassHistogramBeforeFullGC           = false                               {manageable}
         bool PrintConcurrentLocks                      = false                               {manageable}
         bool PrintGC                                   = false                               {manageable}
         bool PrintGCDateStamps                         = false                               {manageable}
         bool PrintGCDetails                            = false                               {manageable}
         bool PrintGCID                                 = false                               {manageable}
         bool PrintGCTimeStamps                         = false                               {manageable}
        java version "1.8.0_131"
        Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
        Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

        将输出结果重定向到文件
        java -XX:+PrintFlagsFinal -version|grep manageable > PrintFlagsFinal.txt

        jinfo:查看进程运行时jvm参数值,jinfo吸引眼球的地方在于,它能通过-flag选项动态修改指定的Java进程中的某些JVM flag的值。虽然这样的flag数量有限,但它们偶尔能够帮助到你。通过以下的命令你便能看到JVM中哪些flag可以被jinfo动态修改:
            格式:jinfo -flag MaxHeapSize pid

            [@xpMac:~]$ jinfo -flag MaxHeapSize 2995
            -XX:MaxHeapSize=734003200

            [@xpMac:~]$ jinfo -flag ThreadStackSize  2994
            -XX:ThreadStackSize=1024
        

        


jstat查看jvm统计信息
    /**
     [@xpMac:Desktop]$ jstat -gc 3824 1000 20
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
     6656.0 7168.0  0.0    0.0    7168.0   7168.0   44032.0    43927.7   263040.0 70148.5 80768.0 24237.3     64    0.191  151    15.594   15.785
     6656.0 7168.0  0.0    0.0    7168.0   7168.0   44032.0    43931.1   263040.0 70150.4 80768.0 24238.4     64    0.191  161    16.572   16.763
     6656.0 7168.0  0.0    0.0    7168.0   7167.8   44032.0    43933.8   263040.0 70152.3 80768.0 24239.4     64    0.191  172    17.648   17.839
     6656.0 7168.0  0.0    0.0    7168.0   7168.0   44032.0    43943.6   263296.0 70153.7 80768.0 24240.0     64    0.191  182    18.623   18.814
     6656.0 7168.0  0.0    0.0    7168.0   7168.0   44032.0    43937.2   263296.0 70156.1 80768.0 24241.5     64    0.191  192    19.605   19.796
     */


    发生导出内存映像文件的两种方式
    //1:jmap -dump:format=b file=heap.hprof 3840
    //2:-Xmx64M -Xms64M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/xupan/Desktop/HeapDumpOnOutOfMemoryError.txt
    //-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/xupan/Desktop/HeapDumpOnOutOfMemoryError.txt
    //使用jmap命令手动导出

jmap+mat实战内存溢出
    ==================================================================================================================
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.3.1</version>
    </dependency>
    <!-- 生成字节码 -->

    @RestController
    public class MemeoryController {

        private List<User> users = new ArrayList<>();
        private List<Class<?>>  classList = new ArrayList<Class<?>>();


        //-Xmx64M -Xms64M
        @GetMapping("/heap")
        private void heap(){
            while (true){
                User user = new User();
                user.setUsername(UUID.randomUUID().toString());
                users.add(user);
            }
        }

        //-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M
        @GetMapping("/noHeap")
        private void noHeap(){
            while (true){
                classList.addAll(Metaspace.createClasses());
            }
        }
    }


    import jdk.internal.org.objectweb.asm.ClassWriter;
    import jdk.internal.org.objectweb.asm.MethodVisitor;
    import jdk.internal.org.objectweb.asm.Opcodes;

    import java.util.ArrayList;
    import java.util.List;

    public class Metaspace extends ClassLoader {

        public static List<Class<?>> createClasses() {
            // 类持有
            List<Class<?>> classes = new ArrayList<Class<?>>();
            // 循环1000w次生成1000w个不同的类。
            for (int i = 0; i < 10000000; ++i) {
                ClassWriter cw = new ClassWriter(0);
                // 定义一个类名称为Class{i},它的访问域为public,父类为java.lang.Object,不实现任何接口
                cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "Class" + i, null,
                        "java/lang/Object", null);
                // 定义构造函数<init>方法
                MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>",
                        "()V", null, null);
                // 第一个指令为加载this
                mw.visitVarInsn(Opcodes.ALOAD, 0);
                // 第二个指令为调用父类Object的构造函数
                mw.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object",
                        "<init>", "()V");
                // 第三条指令为return
                mw.visitInsn(Opcodes.RETURN);
                mw.visitMaxs(1, 1);
                mw.visitEnd();
                Metaspace test = new Metaspace();
                byte[] code = cw.toByteArray();
                // 定义类
                Class<?> exampleClass = test.defineClass("Class" + i, code, 0, code.length);
                classes.add(exampleClass);
            }
            return classes;
        }
    }


    ==================================================================================================================

    public class JvmTest {


        //-XX:+PrintGC -Xms5m -Xmx20m -XX:+UseSerialGC -XX:+PrintGCDetails -XX:+PrintCommandLineFlags
        //-XX:+PrintGC: 只要遇到GC就会打印日志
        //-XX:+UseSerialGC:配置串行回收器
        //-XX:+PrintCommandLineFlags:查看详细信息
        //-Xms:java程序启动时初始堆大小
        //-Xmx:java程序能够获得的最大堆大小
        //-Xmn: 设置新生代的大小 新生代/堆=1/3    新生代/堆=1/4
        //-XX:SurvivorRatio=eden/form=eden/to
        //-XX:NewRatio:    老年代/新生代
        //-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/xupan/Desktop/test.txt
        public static void main(String[] args) {
            System.out.println("maxMemory: " + Runtime.getRuntime().maxMemory());
            System.out.println("freeMemory: " + Runtime.getRuntime().freeMemory());
            System.out.println("totalMemory: " + Runtime.getRuntime().totalMemory());

            byte[] b1 = new byte[1 * 1024*2024];//1M
            System.out.println("==================================");


            System.out.println("maxMemory: " + Runtime.getRuntime().maxMemory());
            System.out.println("freeMemory: " + Runtime.getRuntime().freeMemory());
            System.out.println("totalMemory: " + Runtime.getRuntime().totalMemory());


            System.out.println("==================================");
            byte[] b2 = new byte[4 * 1024*2024];

            System.out.println("maxMemory: " + Runtime.getRuntime().maxMemory());
            System.out.println("freeMemory: " + Runtime.getRuntime().freeMemory());
            System.out.println("totalMemory: " + Runtime.getRuntime().totalMemory());

        }
    }

    ==================================================================================================================


    public class JvmTest2 {


        //-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
        //-Xms: 初始化堆内存
        //-Xmx: 最大堆内存大小
        //Xmn: 新生代大小1m
        //SurvivorRatio : eden/s0,s1 = 2
        public static void main(String[] args) {
            byte[] b = null;

            for (int i = 0; i <= 10; i++) {
                b = new byte[1 * 1024 * 1024];
            }

        }

    }

    ==================================================================================================================


    import java.util.Vector;

    public class JvmTest3 {

        //配置栈深度
        //-Xss1m
        //-Xss5m

        //配置方法区/永久区
        //-XX:PermSize=64M -XX:MaxPermSize=128M

        public static void main(String[] args) {
            //-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/xupan/Desktop/test.txt
            Vector v = new Vector();
            for (int i = 0; i < 5; i++){
                v.add(new byte[1*1024*1024]);
            }
        }

    }


    ==================================================================================================================

    public class JvmTest4 {


        //初始化对象在eden区
        //-Xmx64m -Xms64m -XX:+PrintGCDetails
        public static void main(String[] args) {
            for (int i = 0; i <= 5; i++) {
                byte[] b = new byte[1 * 1024 * 1024];
            }

        }


    }


    ==================================================================================================================

    public class JvmTest5 {
        public static void main(String[] args) {
            //测试进入老年代的对象
            //-Xmx1024m -Xms1024m -XX:+UseSerialGC -XX:MaxTenuringThreshold=15 -XX:+PrintGCDetails

            //15次GC对象进入老年代
            for (int i = 0; i <= 20; i++) {
                for (int j = 0; j <= 300; j++) {
                    byte[] b = new byte[1 * 1024 * 1024];
                }
            }
        }
    }


    ==================================================================================================================

    public class JvmTest6 {

        public static void main(String[] args){

            //-Xmx30m -Xms30m -XX:+UseSerialGC -XX:+PrintGCDetails -XX:PretenureSizeThreshold=1024000
           /* Map<Integer,byte[]> map = new HashMap<>();
            for (int j = 0; j <= 5; j++) {
                byte[] b = new byte[1 * 1024 * 1024];
                map.put(j, b);
            }*/

            //-Xmx30m -Xms30m -XX:+UseSerialGC -XX:+PrintGCDetails -XX:PretenureSizeThreshold=1000 -XX:-UseTLAB

            //-XX:-UseTLAB 禁用TLAB
            //-XX:+UseTLAB 使用TLAB
            //-XX:+TLABSize 设置TLAB大小
            //-XX:+PrintTLAB 查看TLAB信息
            //-XX:+ResizeTLAB 自动调整TLAB
            Map<Integer,byte[]> map = new HashMap<>();
            for (int j = 0; j <= 5*1024; j++) {
                byte[] b = new byte[1024];
                map.put(j, b);
            }
        }
    }
    ==================================================================================================================


jstack实战死循环与死锁

转载于:https://my.oschina.net/u/2253438/blog/1923650

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值