java 调优概要

2018-12-11  本文已影响54人  ac619467fef3

Java调优

实际问题

主要内容

工具

基于JDK命令行

图形化工具

Tomcat工具

Nginx工具

JVM内存结构

Java代码层调优

一、JDK命令行工具的监控

1.1 主要内容

1.2 JVM参数类型

标准参数
X参数
XX参数分类

分为两类,一种是boolean类型,设置生效不生效,另一类是设置值。-XX:<name>=<value>

1.3查看JVM运行时参数

在命令运行时,添加参数,打印参数

-XX:+PrintFlagsInitial 初始值
-XX:+PrintFlagsFinal 最终值

查看正在运行的jVM

jinfo -flags pid,打印手动赋过值得
jinfo -flag 参数名称 pid,查看进程参数
jinfo -flag MaxHeapSize 23789

1.4 jstat查看JVM统计信息

jstat -<option> pid   
-class 类加载信息
-compiler 编译信息
-gc 垃圾回收信息
-printcompilation
[root@localhost home]# jstat -class 11359 1000 10
Loaded  Bytes  Unloaded  Bytes     Time
  6654 12119.4       32    44.8       6.07
  6654 12119.4       32    44.8       6.07
  6654 12119.4       32    44.8       6.07
[root@localhost home]# jstat -gc 11359 1000 10
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU        YGC     YGCT    FGC    FGCT     GCT
1088.0 1088.0 272.1   0.0    8704.0   3000.8   21888.0    14094.7   36096.0 34306.6 4864.0 4425.1     52    0.163   2      0.076    0.239
1088.0 1088.0 272.1   0.0    8704.0   3000.8   21888.0    14094.7   36096.0 34306.6 4864.0 4425.1     52    0.163   2      0.076    0.239
1088.0 1088.0 272.1   0.0    8704.0   3000.8   21888.0    14094.7   36096.0 34306.6 4864.0 4425.1     52    0.163   2      0.076    0.239
1088.0 1088.0 272.1   0.0    8704.0   3000.8   21888.0    14094.7   36096.0 34306.6 4864.0 4425.1     52    0.163   2      0.076    0.239

jstat -gc参数

1.5构建溢出

构建堆溢出
    List<User> userList = new ArrayList();
    /**
     * -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home
     * java.lang.OutOfMemoryError: Java heap space
     * Dumping heap to /home/java_pid10107.hprof ...
     * Heap dump file created [48133870 bytes in 0.202 secs]
     * Exception in thread "http-nio-8080-exec-1" java.lang.OutOfMemoryError: Java heap space
     * @return
     */
    @GetMapping("/heap")
    public String heap()
    {
        int i=0;
        while(true)
        {
            userList.add(new User(UUID.randomUUID().toString(),i++));
        }
    }
构建非堆溢出
    List<Class<?>> classList = new ArrayList<Class<?>>();
    @GetMapping("/noheap")
    public String noheap()
    {
        classList.addAll(Metaspace.createClasses());
        return "noheap";
    }
/*
 * https://blog.csdn.net/bolg_hero/article/details/78189621
 * 继承ClassLoader是为了方便调用defineClass方法,因为该方法的定义为protected
 * */
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;
    }
}

1.6 导出内存镜像文件

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
jmap -dump:live,format=b,file=heap.hprof pid
1.7 jmap命令行
> jmap -heap pid
[root@localhost home]# jmap -heap 11359
Attaching to process ID 11359, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 33554432 (32.0MB)
   NewSize                  = 11141120 (10.625MB)
   MaxNewSize               = 11141120 (10.625MB)
   OldSize                  = 22413312 (21.375MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 10027008 (9.5625MB)
   used     = 4085912 (3.8966293334960938MB)
   free     = 5941096 (5.665870666503906MB)
   40.749064925449346% used
Eden Space:
   capacity = 8912896 (8.5MB)
   used     = 3807328 (3.630950927734375MB)
   free     = 5105568 (4.869049072265625MB)
   42.71706973805147% used
From Space:
   capacity = 1114112 (1.0625MB)
   used     = 278584 (0.26567840576171875MB)
   free     = 835528 (0.7968215942382812MB)
   25.00502642463235% used
To Space:
   capacity = 1114112 (1.0625MB)
   used     = 0 (0.0MB)
   free     = 1114112 (1.0625MB)
   0.0% used
tenured generation:
   capacity = 22413312 (21.375MB)
   used     = 14432968 (13.764350891113281MB)
   free     = 7980344 (7.610649108886719MB)
   64.39462405199195% used

13278 interned Strings occupying 1888808 bytes.
[root@localhost home]#
上一篇 下一篇

猜你喜欢

热点阅读