0%

redis 是一个完全开源的内存数据结构存储系统,可被用于数据库、缓存和消息代理。
redis 能够支持的数据类型包含 strings,hashes,lists,sets,范围查询的排序sets,bitmaps,带半径查询的地理空间索引。
redis 本身支持 replication、Luau 脚本、LRU eviction、事务和不同level的持久化策略,并通过RIDIS前哨和RADIS集群的自动划分提供高可用性。

阅读全文 »

alibaba 开源的一个jvm监控软件,能够

  • 反编译运行中的java程序的代码,
  • 查看java程序的内存、
  • 查看java程序的线程
  • 查看类的静态变量值
  • 查看classloader的继承树,urls,类加载信息
  • 等等

https://alibaba.github.io/arthas/sysenv.html

下面为精简的常用接口

查看类的静态属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ getstatic demo.MathGame random
field: random
@Random[
serialVersionUID=@Long[3905348978240129619],
seed=@AtomicLong[120955813885284],
multiplier=@Long[25214903917],
addend=@Long[11],
mask=@Long[281474976710655],
DOUBLE_UNIT=@Double[1.1102230246251565E-16],
BadBound=@String[bound must be positive],
BadRange=@String[bound must be greater than origin],
BadSize=@String[size must be non-negative],
seedUniquifier=@AtomicLong[-3282039941672302964],
nextNextGaussian=@Double[0.0],
haveNextNextGaussian=@Boolean[false],
serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3],
unsafe=@Unsafe[sun.misc.Unsafe@2eaa1027],
seedOffset=@Long[24],
]

打印出类的Field信息

该方法只能获取 类信息,无法获取实例信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ sc -d -f demo.MathGame
class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash 3d4eac69
fields modifierprivate,static
type java.util.Random
name random
value java.util.Random@522b4
08a

modifierprivate
type int
name illegalArgumentCount

Affect(row-cnt:1) cost in 19 ms.

反编译指定已加载类的源码

1
jad demo.MathGame

查看ClassLoader的继承树

1
2
3
4
5
6
$ classloader -t
+-BootstrapClassLoader
+-sun.misc.Launcher$ExtClassLoader@66350f69
+-com.taobao.arthas.agent.ArthasClassloader@68b31f0a
+-sun.misc.Launcher$AppClassLoader@3d4eac69
Affect(row-cnt:4) cost in 3 ms.

使用ClassLoader去查找resource

1
2
3
4
$ classloader -c 3d4eac69  -r META-INF/MANIFEST.MF
jar:file:/System/Library/Java/Extensions/MRJToolkit.jar!/META-INF/MANIFEST.MF
jar:file:/private/tmp/arthas-demo.jar!/META-INF/MANIFEST.MF
jar:file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar!/META-INF/MANIFEST.MF

观察方法调用前和方法返回后

watch 命令 具体 https://alibaba.github.io/arthas/watch.html

输出当前方法被调用的调用路径

1
2
3
4
5
6
7
8
9
10
11
12
$ stack demo.MathGame primeFactors 'params[0]<0' -n 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 30 ms.
ts=2018-12-04 01:34:27;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)

ts=2018-12-04 01:34:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)

Command execution times exceed limit: 2, so command will exit. You can set it with -n option.

排查 method not found

先通过sc获取当前类的来源,执行以下命令后 查看 code-source 信息

sc -d 类名

使用 jad 反编译 代码,确认方法是否存在。

jad 类名

使用maven排查依赖

其他实践

watch com.example.demo.arthas.user.UserController * ‘{params, throwExp} –e

trace javax.servlet.Servlet * > servlet.txt # 结果在 ~/logs/arthas-cache/

trace javax.servlet.Filter *

  • 动态修复代码/测试

redefine –p UserController.class

  • UserController的logger是什么实现?

ognl ‘@com.example.demo.arthas.user.UserController@logger’

  • 动态修改logger级别

ognl ‘@org.slf4j.LoggerFactory@getLogger(“root”).setLevel(@ch.qos.logback.classic.Level@DEBUG)’

  • 查找冲突的logback.xml/log4j.properties

classloader -c 18b4aac2 -r logback.xml

  • Spring Boot应用的Classloader结构

classloader –t
classloader -a -c 758f7d25

  • jad反编绎jsp的实现

jad org.apache.jsp.jsp.hello_jsp

  • tt 获取Spring Context

tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod

tt -i 1000 -w ‘target.getApplicationContext().getBean(“helloWorldService”).getHelloMessage()’

http://hengyunabc.github.io/spring-boot-inside/

/var/spool/abrt 文件夹会保存 系统 crash事件的相关日志

在ORACLE数据库中,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下还有段、区、块等逻辑结构。从物理结构上看是放在数据文件中。一个表空间可由多个数据文件组成。

阅读全文 »

查看数据库表空间使用情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC;

以管理员身份登录oracle

1
2
su - oracle
sqlplus / as sysdba

新建用户

1
2
Create user user50 identified by user50;
grant connect, resource to user50;

红黑树是一种自平衡二叉树查找树,是一种常用的数据结构。在jdk1.8中,TreeMap、TreeSet和HashMap都使用到了红黑树。

阅读全文 »

JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext、HttpSession和 ServletRequest这三大域对象的创建、销毁事件以及监听这些域对象中的属性发生修改的事件。

阅读全文 »