Skip to content

更新 #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 30, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
| [vjmxcli](/vjmxcli) | JMX 查看工具 | [Chinese](/vjmxcli/README.md)|

视频:[《VJTools如何利用佛性技术玩转JVM》](http://kai.vkaijiang.com/product/course?courseID=120897)

其他直接使用的工具,见[常用工具](docs/other/othertools.md)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ public void test() {
assertThat(CollectionUtil.getLast(set2)).isEqualTo("a");

assertThat(CollectionUtil.getFirst(list1)).isNull();
assertThat(CollectionUtil.getFirst(null)).isNull();
assertThat((List<String>)CollectionUtil.getFirst(null)).isNull();
assertThat(CollectionUtil.getLast(list1)).isNull();
assertThat(CollectionUtil.getLast(null)).isNull();
assertThat((List<String>)CollectionUtil.getLast(null)).isNull();
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public void general() {
assertThat(ListUtil.getLast(list3)).isEqualTo("a");

assertThat(ListUtil.getFirst(list1)).isNull();
assertThat(ListUtil.getFirst(null)).isNull();
assertThat((List<String>)ListUtil.getFirst(null)).isNull();
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public void run() {
}
ThreadLocalContext.put("myname", Thread.currentThread().getName());
ThreadUtil.sleep(RandomUtil.nextLong(100, 300));
System.out.println(ThreadLocalContext.get("myname"));
System.out.println((String)ThreadLocalContext.get("myname"));
ThreadLocalContext.reset();
System.out.println(
"shoud null for " + Thread.currentThread().getName() + ":" + ThreadLocalContext.get("myname"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ public class ReflectionUtilTest {
public void getAndSetFieldValue() {
TestBean bean = new TestBean();
// 无需getter函数, 直接读取privateField
assertThat(ReflectionUtil.getFieldValue(bean, "privateField")).isEqualTo(1);
assertThat((int)ReflectionUtil.getFieldValue(bean, "privateField")).isEqualTo(1);

// 先尝试getter函数, 然后直接读取privateField
assertThat(ReflectionUtil.getProperty(bean, "privateField")).isEqualTo(1);
assertThat((int)ReflectionUtil.getProperty(bean, "privateField")).isEqualTo(1);

// 绕过将publicField+1的getter函数,直接读取publicField的原始值
assertThat(ReflectionUtil.getFieldValue(bean, "publicField")).isEqualTo(1);
assertThat((int)ReflectionUtil.getFieldValue(bean, "publicField")).isEqualTo(1);
// 先尝试getter函数, 成功则补不直接读取publicField
assertThat(ReflectionUtil.getProperty(bean, "publicField")).isEqualTo(2);
assertThat((int)ReflectionUtil.getProperty(bean, "publicField")).isEqualTo(2);

bean = new TestBean();
// 无需setter函数, 直接设置privateField
Expand Down Expand Up @@ -57,7 +57,7 @@ public void getAndSetFieldValue() {
@Test
public void invokeGetterAndSetter() {
TestBean bean = new TestBean();
assertThat(ReflectionUtil.invokeGetter(bean, "publicField")).isEqualTo(bean.inspectPublicField() + 1);
assertThat((int)ReflectionUtil.invokeGetter(bean, "publicField")).isEqualTo(bean.inspectPublicField() + 1);

bean = new TestBean();
// 通过setter的函数将+1
Expand All @@ -69,32 +69,32 @@ public void invokeGetterAndSetter() {
public void invokeMethod() {
TestBean bean = new TestBean();
// 使用函数名+参数类型的匹配, 支持传参数
assertThat(ReflectionUtil.invokeMethod(bean, "privateMethod", new Object[] { "calvin" }))
assertThat((String)ReflectionUtil.invokeMethod(bean, "privateMethod", new Object[] { "calvin" }))
.isEqualTo("hello calvin");

// 使用函数名+参数类型的匹配
assertThat(ReflectionUtil.invokeMethod(bean, "privateMethod", new Object[] { "calvin" },
assertThat((String)ReflectionUtil.invokeMethod(bean, "privateMethod", new Object[] { "calvin" },
new Class[] { String.class })).isEqualTo("hello calvin");

// 仅匹配函数名
assertThat(ReflectionUtil.invokeMethodByName(bean, "privateMethod", new Object[] { "calvin" }))
assertThat((String)ReflectionUtil.invokeMethodByName(bean, "privateMethod", new Object[] { "calvin" }))
.isEqualTo("hello calvin");

// 各种类型
assertThat(ReflectionUtil.invokeMethod(bean, "intType", new Object[] { 1 }, new Class[] { int.class }))
assertThat((int)ReflectionUtil.invokeMethod(bean, "intType", new Object[] { 1 }, new Class[] { int.class }))
.isEqualTo(1);

assertThat(ReflectionUtil.invokeMethod(bean, "integerType", new Object[] { 1 }, new Class[] { Integer.class }))
assertThat((int)ReflectionUtil.invokeMethod(bean, "integerType", new Object[] { 1 }, new Class[] { Integer.class }))
.isEqualTo(1);

assertThat(ReflectionUtil.invokeMethod(bean, "listType", new Object[] { ListUtil.newArrayList("1", "2") },
assertThat((int)ReflectionUtil.invokeMethod(bean, "listType", new Object[] { ListUtil.newArrayList("1", "2") },
new Class[] { List.class })).isEqualTo(2);

assertThat(ReflectionUtil.invokeMethod(bean, "intType", 1)).isEqualTo(1);
assertThat((int)ReflectionUtil.invokeMethod(bean, "intType", 1)).isEqualTo(1);

assertThat(ReflectionUtil.invokeMethod(bean, "integerType", 1)).isEqualTo(1);
assertThat((int)ReflectionUtil.invokeMethod(bean, "integerType", 1)).isEqualTo(1);

assertThat(ReflectionUtil.invokeMethod(bean, "listType", ListUtil.newArrayList("1", "2"))).isEqualTo(2);
assertThat((int)ReflectionUtil.invokeMethod(bean, "listType", ListUtil.newArrayList("1", "2"))).isEqualTo(2);

// 函数名错
try {
Expand Down
2 changes: 1 addition & 1 deletion vjmap/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ vjmap的原始思路来源于R大的[TBJMap](https://github.com/alibaba/TBJMap)

注意:vjmap在执行过程中,会完全停止应用一段时间,必须摘流量执行!!!!

必须设定JAVA_HOME环境变量,必须与目标JVM使用相同的JDK版本运行,必须与目标JVM使用相同用户运行,或root用户执行 (sudo -E vjmap.sh ...,)
必须与目标JVM使用相同的JDK版本运行,必须与目标JVM使用相同用户运行,或root用户执行 (sudo -E vjmap.sh ...,)

vjmap的运行需要一段时间,如果中途需要停止执行,请使用kill vjmap的进程号,让vjmap从目标进程退出。如果错用了kill -9 ,目标java进程会保持在阻塞状态不再工作,此时必须执行两次 kill -18 目标进程PID来重新唤醒目标java进程。

Expand Down
5 changes: 2 additions & 3 deletions vjmap/src/main/assembly/vjmap.bat
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ if "%JAVA_HOME%" == "" goto noJavaHome
echo WARNING!! STW(Stop-The-World) will be performed on your Java process, if this is NOT wanted, type 'Ctrl+C' to exit.


set BASEDIR=%~dp0
set SA_JDI_PATH=%JAVA_HOME%\lib\sa-jdi.jar
java -XX:AutoBoxCacheMax=20000 -classpath "%BASEDIR%\vjmap.jar;%SA_JDI_PATH%" com.vip.vjtools.vjmap.VJMap %*
set DIR=%~dp0
java -XX:AutoBoxCacheMax=20000 -classpath "%DIR%\vjmap.jar;%JAVA_HOME%\lib\sa-jdi.jar" com.vip.vjtools.vjmap.VJMap %*
goto end

:noJavaHome
Expand Down
28 changes: 12 additions & 16 deletions vjmap/src/main/assembly/vjmap.sh
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
#!/bin/sh

if [ -z "$JAVA_HOME" ]; then
echo "JAVA_HOME env is not set, try to find it out"
if [ -z "$JAVA_HOME" ] ; then
echo "JAVA_HOME env doesn't exist, try to find the location of java"
JAVA_HOME=`readlink -f \`which java 2>/dev/null\` 2>/dev/null | \
sed 's/\jre\/bin\/java//' | sed 's/\/bin\/java//'`
fi

SAJDI_PATH=$JAVA_HOME/lib/sa-jdi.jar

JAVA_PATH=`which java 2>/dev/null`
if [ "x$JAVA_PATH" != "x" ]; then
JAVA_PATH=`dirname $JAVA_PATH 2>/dev/null`
JAVA_HOME=`dirname $JAVA_PATH 2>/dev/null`
fi
if [ ! -f "$SAJDI_PATH" ] ; then
echo "JAVA_HOME is $JAVA_HOME, $SAJDI_PATH doesn't exist !" >&2
exit 1
fi

SA_JDI_PATH=$JAVA_HOME/lib/sa-jdi.jar
DIR=$( cd $(dirname $0) ; pwd -P )

echo -e "\033[31mWARNING!! STW(Stop-The-World) will be performed on your Java process, if this is NOT wanted, type 'Ctrl+C' to exit. \033[0m"

PRGDIR=`dirname "$0"`
BASEDIR=`cd "$PRGDIR/" >/dev/null; pwd`

if [ -f ${SA_JDI_PATH} ]; then
java -XX:AutoBoxCacheMax=20000 -classpath $BASEDIR/vjmap.jar:$SA_JDI_PATH com.vip.vjtools.vjmap.VJMap $*
else
echo "JAVA_HOME/lib/sa-jdi.jar is not exist, please set your JAVA_HOME env";
fi
java -XX:AutoBoxCacheMax=20000 -classpath $DIR/vjmap.jar:$SAJDI_PATH com.vip.vjtools.vjmap.VJMap $*
2 changes: 1 addition & 1 deletion vjmxcli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
[Maven Central 下载](http://repo1.maven.org/maven2/com/vip/vjtools/vjmxcli/1.0.1/vjmxcli-1.0.1.zip)


必须设定JAVA_HOME环境变量,必须与目标JVM使用相同的JDK版本运行。
必须与目标JVM使用相同的JDK版本运行。

# 2. 获取MBean属性值

Expand Down
16 changes: 16 additions & 0 deletions vjmxcli/src/main/assembly/vjmxcli.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
@echo off


rem check java
if "%JAVA_HOME%" == "" goto noJavaHome

set DIR=%~dp0
"%JAVA_HOME%\bin\java" %JAVA_OPTS% -cp "%DIR%/vjmxcli.jar;%JAVA_HOME%/lib/tools.jar" com.vip.vjtools.jmx.Client %*
goto end

:noJavaHome
echo Please set JAVA_HOME before running this script
goto end
:end

pause
14 changes: 6 additions & 8 deletions vjmxcli/src/main/assembly/vjmxcli.sh
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
#!/bin/sh

PRGDIR=`dirname "$0"`
BASEDIR=`cd "$PRGDIR/" >/dev/null; pwd`

if [ -z "$JAVA_HOME" ] ; then
echo "JAVA_HOME env doesn't exist, try to find the location of java"
JAVA_HOME=`readlink -f \`which java 2>/dev/null\` 2>/dev/null | \
sed 's/\/bin\/java//'`
sed 's/\jre\/bin\/java//' | sed 's/\/bin\/java//'`
fi

TOOLSJAR="$JAVA_HOME/lib/tools.jar"

if [ ! -f "$TOOLSJAR" ] ; then
echo "$JAVA_HOME seems to be no JDK!" >&2
exit 1
echo "JAVA_HOME is $JAVA_HOME, $TOOLSJAR doesn't exist" >&2
exit 1
fi

JAVA_VERSION=$("$JAVA_HOME"/bin/java -version 2>&1 | awk -F '"' '/version/ {print $2}')
DIR=$( cd $(dirname $0) ; pwd -P )

JAVA_OPTS="-Xms96m -Xmx96m -Xmn64m -Xss256k -XX:ReservedCodeCacheSize=2496k -XX:AutoBoxCacheMax=20000 -XX:+UseSerialGC -Djava.compiler=NONE -Xverify:none"

"$JAVA_HOME"/bin/java $JAVA_OPTS -cp "$BASEDIR/vjmxcli.jar:$TOOLSJAR" \com.vip.vjtools.jmx.Client $*
"$JAVA_HOME"/bin/java $JAVA_OPTS -cp "$DIR/vjmxcli.jar:$TOOLSJAR" com.vip.vjtools.jmx.Client $*
2 changes: 1 addition & 1 deletion vjtop/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

[Maven Central 下载](http://repo1.maven.org/maven2/com/vip/vjtools/vjtop/1.0.1/vjtop-1.0.1.zip)

必须设定JAVA_HOME环境变量,必须与目标JVM使用相同的JDK版本运行,必须与目标JVM使用相同用户运行,或root用户执行 (sudo -E vjmap.sh ...,)
必须与目标JVM使用相同的JDK版本运行,必须与目标JVM使用相同用户运行,或root用户执行 (sudo -E vjmap.sh ...,)

```
// 占用CPU最多的线程
Expand Down
2 changes: 0 additions & 2 deletions vjtop/README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ VJtop is built as NON stop-the-world and is considered ready for production diag

[download from Maven Central](http://repo1.maven.org/maven2/com/vip/vjtools/vjtop/1.0.1/vjtop-1.0.1.zip)

Set JAVA_HOME environment variable to your JDK directory.

Run the following command under **the same user who started the target process**.

```
Expand Down
14 changes: 13 additions & 1 deletion vjtop/src/main/assembly/vjtop.bat
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
@echo off
set DIR=%~dp0


rem check java
if "%JAVA_HOME%" == "" goto noJavaHome

set DIR=%~dp0
"%JAVA_HOME%\bin\java" %JAVA_OPTS% -cp "%DIR%/vjtop.jar;%JAVA_HOME%/lib/tools.jar" com.vip.vjtools.vjtop.VJTop %*
goto end

:noJavaHome
echo Please set JAVA_HOME before running this script
goto end
:end

pause
13 changes: 7 additions & 6 deletions vjtop/src/main/assembly/vjtop.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,21 @@
#
# author: Markus Kolb
#
DIR=$( cd $(dirname $0) ; pwd -P )

if [ -z "$JAVA_HOME" ] ; then
echo "JAVA_HOME env doesn't exist, try to find the location of java"
JAVA_HOME=`readlink -f \`which java 2>/dev/null\` 2>/dev/null | \
sed 's/\/bin\/java//'`
sed 's/\jre\/bin\/java//' | sed 's/\/bin\/java//'`
fi

TOOLSJAR="$JAVA_HOME/lib/tools.jar"

if [ ! -f "$TOOLSJAR" ] ; then
echo "$JAVA_HOME seems to be no JDK!" >&2
exit 1
echo "JAVA_HOME is $JAVA_HOME, $TOOLSJAR doesn't exist" >&2
exit 1
fi

"$JAVA_HOME"/bin/java -Xmx512m -XX:+UseSerialGC -XX:-TieredCompilation -XX:CICompilerCount=2 -XX:AutoBoxCacheMax=20000 -cp "$DIR/vjtop.jar:$TOOLSJAR" \
DIR=$( cd $(dirname $0) ; pwd -P )

"$JAVA_HOME"/bin/java -Xms256m -Xmx512m -XX:+UseSerialGC -XX:-TieredCompilation -XX:CICompilerCount=2 -XX:AutoBoxCacheMax=20000 -cp "$DIR/vjtop.jar:$TOOLSJAR" \
com.vip.vjtools.vjtop.VJTop "$@"
exit $?