JVM 参数类型

文档查看地址 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/toc.html

图片.png

默认 java -version 为混合模式


图片.png

图片.png

图片.png
图片.png
  • 查看当前进程堆最大空间
    jinfo -flag MaxHeapSize 进程id

    图片.png

  • jinfo -flag ThreadStackSize 进程id (调优时会把该值改小,改为512k)


    图片.png
图片.png

java -XX:+PrintFlagsFinal -version > flags.txt
sz flags.txt 将文件拿到本地

  • 查看进程
    jps 、jps -l


    图片.png

    图片.png
  • 查询当前进程被手动赋值的信息
    jinfo -flags 进程id

jstat查看JVM统计信息

  • 类装载
  • 垃圾收集
  • JIT编译
图片.png

Loaded加载的类的个数 bytes 占用的字节数 unloaded 卸载的类的个数 times花费的时间

  • gc信息查看
    jstat -gc 1759 1000 10
    图片.png

    图片.png

    非堆区是指操作系统的本地内存,独立于堆区之外的。
    图片.png

jmap +MAT实战内存溢出

start.spring.io

-Xmx32M -Xms32M 设置最大内存和最小内存

package com.alan.springbootdemo3.controller;


import com.alan.springbootdemo3.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

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


//相当于@Controller 和@ResponseBody两个注解的组合
@RestController
public class MemoryCcontroller {


    private List users =  new ArrayList<>();


    /**
     * -Xmx32M -Xms32M 设置最大内存和最小内存
     * @return
     */
    @GetMapping("/heap")
    public String heap(){
        int i = 0;
        while (true){
            users.add(new User(i++, UUID.randomUUID().toString()));
        }
    }

}

导出内存映像文件

图片.png

jmap -dump:format=b,file=heap.hprof 进程id

通过MAT工具分析内存溢出

图片.png
图片.png

jstack实战死循环和死锁

jstack 进程id
配合top查看cpu 情况 根据堆栈信息找到有问题的方法

  • 定位死锁
    /**
     * 死锁
     * */
    @RequestMapping("/deadlock")
    public String deadlock(){
        new Thread(()->{
            synchronized(lock1) {
                try {Thread.sleep(1000);}catch(Exception e) {}
                synchronized(lock2) {
                    System.out.println("Thread1 over");
                }
            }
        }) .start();
        new Thread(()->{
            synchronized(lock2) {
                try {Thread.sleep(1000);}catch(Exception e) {}
                synchronized(lock1) {
                    System.out.println("Thread2 over");
                }
            }
        }) .start();
        return "deadlock";
    }
  • jstack日志中错误信息
com.alan.springbootdemo3.chapter2.CpuController.lambda$deadlock$0(CpuController.java:33)
    - waiting to lock <0x0000000744ad3408> (a java.lang.Object)
    - locked <0x0000000744ad33f8> (a java.lang.Object)
    at com.alan.springbootdemo3.chapter2.CpuController$$Lambda$148/1545477220.run(Unknown Source)
    at java.lang.Thread.run([email protected]/Thread.java:844)
"Thread-4":
    at com.alan.springbootdemo3.chapter2.CpuController.lambda$deadlock$1(CpuController.java:41)
    - waiting to lock <0x0000000744ad33f8> (a java.lang.Object)
    - locked <0x0000000744ad3408> (a java.lang.Object)
    at com.alan.springbootdemo3.chapter2.CpuController$$Lambda$149/1478591295.run(Unknown Source)
    at java.lang.Thread.run([email protected]/Thread.java:844)

Found 1 deadlock.

你可能感兴趣的:(JVM 参数类型)