Выпущен Arthas 3.5.1: возможности на уровне Бога! объект поиска в памяти

Java
Выпущен Arthas 3.5.1: возможности на уровне Бога! объект поиска в памяти

ArthasЭто инструмент диагностики Java с открытым исходным кодом от Alibaba, который очень нравится разработчикам.

использовался раньшеwatchПри ожидании команды нам обычно нужно знать, какой класс вызывается, какая функция вызывается, а затем инициировать вызов. Это имеет ограничения:

  1. Трудно инициировать звонки онлайн
  2. Возможно, вам придется выбрать несколько раз, чтобы посмотреть правильную функцию
  3. Условное выражение/выражение результата может потребовать нескольких тестов

Кроме того, если вы хотите найти объекты в памяти, вам нужен повторный анализ heapdump.

В последней версии 3.5.1 Артас привносит функции божественного уровня: черезvmtoolКоманда, вы можете искать объекты в памяти JVM.

VMTool Онлайн-Учебник

Ниже сvmtoolПример онлайн-учебника, демонстрацияvmtoolФункция команды:

Сначала запустите любое загрузочное приложение Spring, например:

wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar
java -jar demo-arthas-spring-boot.jar

затем используйтеarthasПрикрепите целевой процесс, вы можете использовать его после успехаvmtoolкоманда:

wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

Найти строковые объекты в jvm

Во-первых,vmtoolкоманда принятаgetInstancesЭто действие ищет в JVM строку:

$ vmtool --action getInstances --className java.lang.String
@String[][
    @String[Sorry, deque too big],
    @String[head=%d tail=%d capacity=%d%n],
    @String[elements=%s%n],
    @String[sun/nio/ch/IOVecWrapper],
    @String[40252e37-8a73-4960-807e-3495addd5b08:1620922383791],
    @String[40252e37-8a73-4960-807e-3495addd5b08:1620922383791],
    @String[sun/nio/ch/AllocatedNativeObject],
    @String[sun/nio/ch/NativeObject],
    @String[sun/nio/ch/IOVecWrapper$Deallocator],
    @String[Java_sun_nio_ch_FileDispatcherImpl_writev0],
]

предельный параметр

пройти через--limitПараметр может ограничить количество возвращаемых значений и избежать нагрузки на JVM при получении больших данных. Значение по умолчанию — 10.

Таким образом, приведенная выше команда фактически эквивалентна:

vmtool --action getInstances --className java.lang.String --limit 10

Если установлено--limitОтрицательный, обход всех объектов.

найти весенний контекст

В предыдущем онлайн-уроке нам нужно пройтиttкоманда для перехвата вызова spring, а затем получения контекста spring.

пройти черезvmtoolкомандой, мы можем напрямую получить контекст srping:

$ vmtool --action getInstances \
--className org.springframework.context.ApplicationContext
@ApplicationContext[][
    @AnnotationConfigEmbeddedWebApplicationContext[org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@12028586: startup date [Thu May 13 16:08:38 UTC 2021]; root of context hierarchy],
]

Укажите количество слоев для расширения возвращаемого результата

getInstancesДействие возвращает результат, привязанный кinstancesДля переменной это массив.

пройти через-x/--expandПараметр может указывать уровень расширения результата, значение по умолчанию равно 1.

vmtool --action getInstances --className org.springframework.context.ApplicationContext -x 2

Получить spring bean, выполнить выражение

getInstancesДействие возвращает результат, привязанный кinstancesДля переменной это массив. в состоянии пройти--expressПараметр выполняет указанное выражение.

Например, чтобы найти все имена весенних бобов:

vmtool --action getInstances \
--className org.springframework.context.ApplicationContext \
--express 'instances[0].getBeanDefinitionNames()'

Например, звонокuserController.findUserById(1)функция:

$ vmtool --action getInstances \
--className org.springframework.context.ApplicationContext \
--express 'instances[0].getBean("userController").findUserById(1)'
@User[
    id=@Integer[1],
    name=@String[name1],
]

Найти все объекты Spring Mapping

vmtool --action getInstances --className org.springframework.web.servlet.HandlerMapping

$ vmtool --action getInstances --className org.springframework.web.servlet.HandlerMapping
@HandlerMapping[][
    @SimpleUrlHandlerMapping[org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@5d3819c8],
    @EmptyHandlerMapping[org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@11d509ba],
    @RequestMappingHandlerMapping[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@56a5f2e3],
    @WelcomePageHandlerMapping[org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WelcomePageHandlerMapping@4c0a4ed3],
    @EmptyHandlerMapping[org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@51e1f8c3],
    @BeanNameUrlHandlerMapping[org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@68c0a39c],
    @SimpleUrlHandlerMapping[org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@110b768d],
]

Найти все javax.servlet.Filters

В онлайн-руководстве Артаса мы рассказали, как устранять неполадки HTTP-запросов 404/401. используетtrace javax.servlet.Filter *Заказ.

использовать сейчасvmtoolКоманда, мы можем найти все объекты Фильтра напрямую, чтобы ускорить процесс позиционирования.

$ vmtool --action getInstances --className javax.servlet.Filter
@Filter[][
    @OrderedCharacterEncodingFilter[org.springframework.boot.web.filter.OrderedCharacterEncodingFilter@49b69493],
    @OrderedHiddenHttpMethodFilter[org.springframework.boot.web.filter.OrderedHiddenHttpMethodFilter@5477cb9e],
    @AdminFilter[com.example.demo.arthas.AdminFilterConfig$AdminFilter@3b625385],
    @WsFilter[org.apache.tomcat.websocket.server.WsFilter@14875f22],
    @OrderedRequestContextFilter[org.springframework.boot.web.filter.OrderedRequestContextFilter@6bed550e],
    @OrderedHttpPutFormContentFilter[org.springframework.boot.web.filter.OrderedHttpPutFormContentFilter@3e538cba],
]

Укажите имя загрузчика классов

В случае нескольких загрузчиков классов вы также можете указать загрузчик классов для поиска объектов:

vmtool --action getInstances \
 --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader \
 --className org.springframework.context.ApplicationContext

Укажите хэш загрузчика классов

в состоянии пройтиscКоманда находит загрузчик классов, который загружает класс.

$ sc -d org.springframework.context.ApplicationContext
 class-info        org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext
 code-source       file:/private/tmp/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spring-boot-1.5.13.RELEASE.jar!/
 name              org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext
...
 class-loader      +-org.springframework.boot.loader.LaunchedURLClassLoader@19469ea2
                     +-sun.misc.Launcher$AppClassLoader@75b84c92
                       +-sun.misc.Launcher$ExtClassLoader@4f023edb
 classLoaderHash   19469ea2

затем используйте-c/--classloaderПараметр указывает:

vmtool --action getInstances \
-c 19469ea2 \
--className org.springframework.context.ApplicationContext

Принудительный сбор мусора

при включении-XX:+DisableExplicitGCПосле аргументов JVM вызовитеSystem.Gc()Не может вызывать поведение GC.

vmtoolФункция принудительного GC представлена ​​здесь:

vmtool --action forceGc

Если приложение настраивает-verbose:gcпараметр, вы можете увидеть аналогичный журнал в стандартном выводе приложения:

[GC (JvmtiEnv ForceGarbageCollection)  25760K->17039K(349696K), 0.0015299 secs]
[Full GC (JvmtiEnv ForceGarbageCollection)  17039K->16840K(353792K), 0.0154049 secs]

Спасибо

  • vmtoolОсобенности находятся в сообществе разработчиковdragon-zhang(张子成)По первоначальному PR от , было выполнено много обсуждений и доработок.Спасибо за его работу.При этом все желающие могут подать PR и поучаствовать в разработке 😄.

Суммировать

Выше показано только использованиеvmtoolПримеры команд, управляющих контекстом пружины. На самом деле, его можно применять разными способами, например:

  • Найти экземпляр поставщика/потребителя для RPC
  • Найдите информацию об объекте подписки MQ
  • Найдите картографический объект Mybatis

Добро пожаловать в выпуск, чтобы поделиться своим опытом:GitHub.com/Alibaba/art…

Набор персонала

Наконец, объявление: мы ищем небольших партнеров, особенно студентов в Шэньчжэне, приглашаем присоединиться.