Java调试与定位

目录:

  • Java程序测试:JVM调试体系, Intellij 调试, Junit自动化
  • Java程序监控: 常用监控工具, 性能问题
  • Java典型问题:锁问题, 线程池问题,JVM内存基础介绍, JVM内存问题分析与定位, TLS问题, Crash问题

JVM调试体系

简介

JPDA 全称 Java Platform Debugger Architecture. 是Java定义的标准调试框架。

Java调试与定位

大部分调试工具都是基于JPDA提供的上层接口,扩展定制而来的。

JVM TI基本原理

JVM TI 是JVM提供的native 编程接口,可以用来获取JVM内部状态,以及控制Java程序的执行。

Java调试与定位

JVM TI 的典型能力:

  • 各类事件的钩子(比如类加载)
  • Java对象操控
  • Java线程和锁操控
  • 基本调试原语(比如断点)

一般采用建立一个Agent方式来调用JVM TI , 而控制方往往是另一个独立的进程。

Agent加载的方式:

  • 在JVM启动时,通过命令行选项指定Agent加载。
  • JVM运行时加载。(attach机制)

Java动态追踪技术

JVM内置的 libinstrument.so

可基于这套 instrumentation 用Java开发Agent。

  • 监控指定方法的执行内容,比如入参,返回值;
  • 指定方法的调用情况,eg,时间戳,调用次数,耗时。
  • 指定方法的调用路径等。

IntelliJ调试

条件断点

双击shift : 搜索

ctrl + 单击 : 查看当前变量或方法被哪些代码引用

Junit自动化测试

junit & Mockito

mock test: 如何在不受其他模块影响的情况下测试一个单独的模块。

常用监控工具

基础故障处理工具

Jps , Jstat, Jinfo,

Jmap: 生成堆转储快照

JHat ,

Jstack: 当前线程的快照。

可视化故障处理工具

JConsole, VisulVM

JMC: 可持续的在线监控工具。

MAT: 内存分析工具

常用linux诊断命令

strace: 追踪系统调用,获取进程动态信息,获取系统级调用,即程序现在在干什么。

eg: strace -o strace.txt -T -tt -e trace=all -p

pstack: 显示进程的线程堆快照。

eg: pstack

pmap: 查询进程的内存映射关系,常用于排查内存泄露。

eg: pmap -x

vmstat:监控整个系统资源使用情况。

top: 显示各进程的资源占用状况。

eg: top -H -p

Original: https://www.cnblogs.com/Vincent-yuan/p/16224019.html
Author: Vincent-yuan
Title: Java调试与定位

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538477/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 也说JVM内存区域

    运行时数据区五个部分 方法区 堆 程序计数器 本地方法栈 虚拟机栈 生命周期的区别 方法区和堆是随虚拟机启动创建,对应一个进程的生命周期 程序计数器、本地方法栈、虚拟机栈是随着线程…

    Java 2023年6月9日
    089
  • Redis学习笔记之字典

    Redis 学习笔记之字典 一、字典的实现 1.1 字典内部定义 哈希表 typedef struct dictht { // 哈希表数组 dictEntry **table; /…

    Java 2023年6月5日
    085
  • Centos7 上手 Docker 容器及 docker-compose

    卸载旧版本 Docker 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。 yum remove d…

    Java 2023年6月7日
    088
  • 异步线程中通过 HttpServletRequest#getRequestURI 有时拿到值,有时拿到 null

    由于 HttpServletRequest 不是线程安全的(后知后觉),当主线程完成自己的工作返回response后,相应的 HttpServletRequest 等对象就会被销毁…

    Java 2023年5月30日
    075
  • Java(2)数据类型与变量

    前言 Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共8种基本类型,其中有4种整型、2种浮点型、1种字符串类型char(用于表示Unicode编…

    Java 2023年6月9日
    086
  • 集合笔记记录

    基础概念 Collection 是一个接口,定义了一些集合的通用方法(不做记录,自己查表)。在 Collection 中存放的是单列数据,即非 (key, value) 对形式的数…

    Java 2023年6月7日
    069
  • redis5.0.4-cluster集群搭建及jedis客户端操作

    一、去官网下载redis5.0 https://redis.io/download 然后解压安装 $ tar xzf redis-5.0.4.tar.gz $ cd redis-5…

    Java 2023年6月9日
    0141
  • Vue学习

    安装卸载 安装node.js。进入官&#…

    Java 2023年6月5日
    0129
  • lua 发送消息到 Rabbitmq

    lua 发送消息到 kakfka 的类库挺多的,还都比较靠谱,但是 lua 连接 Rabbitmq 的几个类库好像都不太好用, 有用stomp 协议的, 还有 用AMQP 协议的,…

    Java 2023年5月30日
    0107
  • java面试——垃圾回收机制

    垃圾回收机制:——GC 初学java时。最经典的一句话是”java不像C,需要担心处理不用的内存,他有自己的垃圾回收,会自己处理的”,这是当时老师上课提过的…

    Java 2023年6月9日
    0106
  • Effective Java 3 读后感

    Effective Java 3 读后感 最近学习了一下Effectvie Java,这是一本非常适合有一定经验的Java后端人员阅读的书。书中总结许多编码经验对开发很有帮助,比如…

    Java 2023年6月16日
    077
  • 使用Jsonp实现跨域请求

    showData( {"data":[{"u":"/products/1.html","n":&qu…

    Java 2023年6月7日
    079
  • 解决云服务器响应慢,网页加载慢的问题

    问题: 本文接上一次博客,云服务发布springboot项目踩过的坑 自从上次,一咬牙买了阿里云的服务器(虽然是白嫖的15天试用期)。 但是有一个问题一直困扰着我,如鲠在喉! 非常…

    Java 2023年6月6日
    085
  • 获取一个字符串中的指定字符

    在写代码的过程中总是会遇到提取字符传中想要的部分,但每次遇到的情况不一样,在这里做个总结 例如:9天,取出数字 9 String Str = "9天…

    Java 2023年6月8日
    060
  • 【力扣】11. 盛最多水的容器

    给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i…

    Java 2023年6月8日
    084
  • 修改 win10 右键“新建”菜单 添加.md文件

    1.1 修改 win10 右键”新建”菜单 看了很多方法终于解决了,因此自己记录总结的方法以便于大家参考。 操作 运行注册表编辑器(regedit.exe)…

    Java 2023年6月14日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球