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…
Набор персонала
Наконец, объявление: мы ищем небольших партнеров, особенно студентов в Шэньчжэне, приглашаем присоединиться.