首页 > 其他 > 详细

JVM学习笔记-从底层了解程序运行(八)

时间:2020-05-05 10:46:27      阅读:157      评论:0      收藏:0      [点我收藏+]
解决JVM运行中的问题
    一个案例理解常用工具
        测试代码:
        /**
         * 从数据库中读取信用数据,套用模型,并把结果进行记录和传输
         */
        
        public class T15_FullGC_Problem01 {
        
            private static class CardInfo {
                BigDecimal price = new BigDecimal(0.0);
                String name = "张三";
                int age = 5;
                Date birthdate = new Date();
        
                public void m() {}
            }
        
            private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(50,
                    new ThreadPoolExecutor.DiscardOldestPolicy());
        
            public static void main(String[] args) throws Exception {
                executor.setMaximumPoolSize(50);
        
                for (;;){
                    modelFit();
                    Thread.sleep(100);
                }
            }
        
            private static void modelFit(){
                List<CardInfo> taskList = getAllCardInfo();
                taskList.forEach(info -> {
                    // do something
                    executor.scheduleWithFixedDelay(() -> {
                        //do sth with info
                        info.m();
        
                    }, 2, 3, TimeUnit.SECONDS);
                });
            }
        
            private static List<CardInfo> getAllCardInfo(){
                List<CardInfo> taskList = new ArrayList<>();
        
                for (int i = 0; i < 100; i++) {
                    CardInfo ci = new CardInfo();
                    taskList.add(ci);
                }
        
                return taskList;
            }
        }
    java -Xms200M -Xmx200M -XX:+PrintGC com.mashibing.jvm.gc.T15_FullGC_Problem01
    一般是运维团队首先受到报警信息(CPU Memory)
    top命令观察到问题:内存不断增长 CPU占用率居高不下
    top -Hp +pid观察进程中的线程,哪个线程CPU和内存占比高
    jps定位具体java进程 
    jstack 定位线程状况,重点关注:WAITING BLOCKED jstack +PID
    技术分享图片

 


          eg. 

         waiting on condition [0xe7f5a000]  (a java.lang.Object) 假如有一个进程中100个线程,很多线程都在waiting on <xx> ,
        一定要找到是哪个线程持有这把锁 
   技术分享图片

 


         怎么找?搜索jstack dump的信息,找<xx> ,看哪个线程持有这把锁RUNNABLE 

        作业:1:写一个死锁程序,用jstack观察 
        2 :写一个程序,一个线程持有锁不释放,其他线程等待
    为什么阿里规范里规定,线程的名称(尤其是线程池)都要写有意义的名称 
        怎么样自定义线程池里的线程名称?(自定义ThreadFactory)
    jinfo pid  查询虚拟机信息
    技术分享图片

 


     jstat -gc 动态观察gc情况 / 阅读GC日志发现频繁GC / arthas观察 / jconsole/jvisualVM/ Jprofiler(最好用) jstat -gc 4655 500

    技术分享图片

 


     每个500个毫秒打印GC的情况 如果面试官问你是怎么定位OOM问题的?如果你回答用图形界面(错误) 

1:已经上线的系统不用图形界面用什么?(cmdline arthas) 
    2:图形界面到底用在什么地方?测试!测试的时候进行监控!(压测观察)
    jmap - histo 4655 | head -20,查找有多少对象产生
    技术分享图片

 


     jmap -dump:format=b,file=xxx pid 1361

线上系统,内存特别大,jmap -demp执行期间会对进程产生很大影响,甚至卡顿(电商不适合) 
        1:设定了参数HeapDump,OOM的时候会自动产生堆转储文件 
        2:很多服务器备份(高可用),停掉这台服务器对其他服务器不影响 
        3:在线定位(一般小点儿公司用不到)
    java -Xms20M -Xmx20M -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError com.mashibing.jvm.gc.T15_FullGC_Problem01
    使用MAT / jhat /jvisualvm 进行dump文件分析 https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html 
        jhat -J-mx512M xxx.dump http://192.168.17.11:7000 
        拉到最后:找到对应链接 可以使用OQL查找特定问题对象
    找到代码的问题
    问题分析流程: 慢,CPU飙高->top->Jps->Jstack->Jmap
    jconsole远程连接
            程序启动加入参数:
java -Djava.rmi.server.hostname=192.168.65.10 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=11111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -XX:+PrintGC -Xms200M -Xmx200M T15_FullGC_Problem01
            如果遭遇 Local host name unknown:XXX的错误,修改/etc/hosts文件,把XXX加入进去
192.168.65.10 basic localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
            关闭linux防火墙(实战中应该打开对应端口)
service iptables stop
chkconfig iptables off #永久关闭
        windows上打开 jconsole远程连接 192.168.17.11:11111
   技术分享图片

 


     jvisualvm远程连接

        https://www.cnblogs.com/liugh/p/7620336.html (简单做法)
   技术分享图片

 

 

 

JVM学习笔记-从底层了解程序运行(八)

原文:https://www.cnblogs.com/hikoukay/p/12829127.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!