Arthas
Это инструмент диагностики Java с открытым исходным кодом от Alibaba, который очень нравится разработчикам.
- Гитхаб:GitHub.com/Alibaba/art…
- Документация:arthas.aliyun.com/doc/
использовался раньшеwatch
При ожидании команды нам обычно нужно знать, какой класс вызывается, какая функция вызывается, а затем инициировать вызов. Это имеет ограничения:
- Трудно инициировать звонки онлайн
- Возможно, вам придется выбрать несколько раз, чтобы посмотреть правильную функцию
- Условное выражение/выражение результата может потребовать нескольких тестов
Кроме того, если вы хотите найти объекты в памяти, вам нужен повторный анализ 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 wiki: arthas.aliyun.com/doc/vmtool
- Журнал выпуска:GitHub.com/Alibaba/art…
Выше показано только использованиеvmtool
Примеры команд, управляющих контекстом пружины. На самом деле, его можно применять разными способами, например:
- Найти экземпляр поставщика/потребителя для RPC
- Найдите информацию об объекте подписки MQ
- Найдите картографический объект Mybatis
Добро пожаловать в выпуск, чтобы поделиться своим опытом:GitHub.com/Alibaba/art…
Набор персонала
Наконец, объявление: мы ищем небольших партнеров, особенно студентов в Шэньчжэне, приглашаем присоединиться.