记一次jvm堆栈分析

记一次jvm堆栈分析threadPoolLock.if (ThreadManager.pool.// if (runnableList.// throw new LocalRuntimeException(“线程集合size:” + runnableList.TimeUnit.r – new Th…

程序如下:

@Slf4j
public abstract class XExecutor implements DataExecutor {
    private final Lock threadPoolLock = new ReentrantLock();
    @Override
    public boolean executor(List<DataRunnable> runnableList, int corePoolSize, int maxPoolSize, int capacity, String threadName) {
        try {
            threadPoolLock.lock();
            if (ThreadManager.pool.get() == null) {
                if (runnableList == null) {
                    throw new LocalRuntimeException("线程集合为空");
                }
// if (runnableList.size() >= capacity) {
// throw new LocalRuntimeException("线程集合size:" + runnableList.size() + " > 线程池队列容量capacity:" + capacity);
// }
                ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize,//核心池大小
                        maxPoolSize,//最大池大小
                        1000,//线程最大空闲时间,超过此空闲时间可以被收回
                        TimeUnit.MILLISECONDS, //最大空闲时间的单位
                        new ArrayBlockingQueue<>(capacity),//用于保存执行任务的队列,可以选择其他不同的队列来做任务管理
                        r -> new Thread(r, threadName + "-" + r.hashCode())
                );
                ThreadManager.pool.set(threadPool);
            }
            CountDownLatch countDownLatch = new CountDownLatch(runnableList.size());
            RunnableStatus runnableStatus = new RunnableStatus(countDownLatch);
            runnableList.forEach(runnable -> {
                runnable.setRunnableStatus(runnableStatus);
                ThreadManager.pool.get().submit(runnable);
            });
            //等待所有线程完毕
            ThreadManager.pool.get().shutdown();
            countDownLatch.await();
            this.remove(threadName);
            log.info("线程池执行完毕:{}", threadName);

            if (!runnableStatus.getExceptionList().isEmpty()) {
                runnableStatus.getExceptionList().forEach(e -> log.error("multi thread err,", e));
                return false;
            }
            return true;
        } catch (Exception e) {
            log.error("处理数据出现错误:", e);
           throw new RuntimeException("线程执行出现问题.....",e);
        } finally {
            threadPoolLock.unlock();
        }
        return false;
    }

使用jstack导出线程堆栈

jstack 16306 > jstack.tdump

使用jmap导出堆内存

jmap -dump:format=b,file=HeapDump.hprof 16306

使用VisualVM

在jdk的bin目录下,打开自带的jvisualVm工具
点击打开按钮
在这里插入图片描述

根据线程堆栈中

使用jvisualVm打开线程堆栈jstack.tdump
在这里插入图片描述
在堆栈中,找到如下信息
在这里插入图片描述
其中tid没有弄清楚是什么,有人说是线程栈的开始地址,貌似有道理。

在内存堆栈中,使用OQL查找对象

select heap.findObject(“0xf3800b58”)
在这里插入图片描述
点击对象连接,可以看到:
在这里插入图片描述
可以看到线程池中的两个执行线程,都在等待这个对象地址的锁

另外:介绍一个查找最消耗cpu的java线程,jps 找到java进程PID

命令:ps -mp p i d ∗ ∗ − o T H R E A D , t i d , t i m e 或 者 p s − L f p ∗ ∗ {pid}** -o THREAD,tid,time 或者 ps -Lfp ** pid∗∗−oTHREAD,tid,time或者ps−Lfp∗∗{pid}

www.cnblogs.com/wangkangluo…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/36677.html

(0)
上一篇 2023-11-17
下一篇 2023-11-17

相关推荐

  • 面试官:MySQL事务是怎么实现的「终于解决」

    面试官:MySQL事务是怎么实现的「终于解决」前言用过MySQL的同学都知道,它的InnoDB存储引擎,是通过事务来保证数据的一致性的。数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的:为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。特性说到事务…

    2023-04-02
    91
  • mysql异常解决方案 – Lock wait timeout exceeded异常[亲测有效]

    mysql异常解决方案 – Lock wait timeout exceeded异常[亲测有效]从异常堆栈来看,问题的根源在于Lock wait timeout exceeded; try restarting transaction异常。从异常信息来看,应该是:mysql锁超时了 刚开始的时候,认为是大资源导致操作的sql较多,从而达到设置的最大超时时间。尝试在测试、预…

    2023-04-02
    121
  • mysql 命令(mysql查看表内容命令)[通俗易懂]

    mysql 命令(mysql查看表内容命令)[通俗易懂]

    2023-08-27
    83
  • oracle to_date to_char_to_date oracle

    oracle to_date to_char_to_date oracle这篇文章主要介绍了Oracle之TO_DATE用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

    2023-07-01
    132
  • 堆栈与队列的不同之处

    堆栈与队列的不同之处在这篇文章中,我们将详细讨论 “堆栈与队列 “的问题。 内容。 什么是堆栈? 什么是队列? 堆栈和队列之间的区别。 堆栈和队列的相似之处。 实施。 什么是堆栈? 堆栈是一种线性数据结构,其中插入和删除

    2023-11-17
    78
  • c语言写2048游戏_linux C编程视频

    c语言写2048游戏_linux C编程视频2048的游戏规则非常简单,简约的灰色格子界面,系统一般给出2或者4的数字,玩家可以每次选择上下左右四个方向中的一个进行滑动,所有的数字在往这个

    2022-12-14
    122
  • MySQL-长事务详解[亲测有效]

    MySQL-长事务详解[亲测有效]前言: 『入门MySQL』系列文章已经完结,今后我的文章还是会以MySQL为主,主要记录下近期工作及学习遇到的场景或者自己的感悟想法,可能后续的文章不是那么连贯,但还是希望大家多多支持。言归正传,本篇

    2023-04-02
    114
  • mysql数据库运行原理_前端后端数据库的关系

    mysql数据库运行原理_前端后端数据库的关系整理了一些Mysql数据库相关流程图/原理图,做一下笔记,大家一起学习。 mysql主从复制原理是大厂后端的高频面试题,了解mysql主从复制原理非常有必要。 主数据库有个bin-log二进制文件,纪录了所有增删改Sql语句。(binlog线程) 从数据库把主数据库的bin-l…

    2023-04-02
    107

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注