jar反编译软件
jd-gui反编译软件:
https://jd-gui.apponic.com/mac/download/
jvm参数推荐
jvm参数推荐:
JAVA_OPTS=-Xms1g -Xmx1g -XX:NewRatio=1 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+AlwaysPreTouch -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+ExplicitGCInvokesConcurrent -XX:+ParallelRefProcEnabled -XX:+CMSParallelInitialMarkEnabled -XX:MaxTenuringThreshold=3 -XX:+UnlockDiagnosticVMOptions -Xloggc:/data/logs/egb/gc-
A
P
P
N
A
M
E
.
l
o
g
−
X
X
:
+
P
r
i
n
t
G
C
D
e
t
a
i
l
s
−
X
X
:
+
P
r
i
n
t
G
C
D
a
t
e
S
t
a
m
p
s
−
X
X
:
+
P
r
i
n
t
P
r
o
m
o
t
i
o
n
F
a
i
l
u
r
e
−
X
X
:
+
P
r
i
n
t
G
C
A
p
p
l
i
c
a
t
i
o
n
S
t
o
p
p
e
d
T
i
m
e
−
X
X
:
−
U
s
e
B
i
a
s
e
d
L
o
c
k
i
n
g
−
X
X
:
A
u
t
o
B
o
x
C
a
c
h
e
M
a
x
=
20000
−
D
j
a
v
a
.
s
e
c
u
r
i
t
y
.
e
g
d
=
f
i
l
e
:
/
d
e
v
/
.
/
u
r
a
n
d
o
m
−
X
X
:
+
P
r
i
n
t
C
o
m
m
a
n
d
L
i
n
e
F
l
a
g
s
−
X
X
:
−
O
m
i
t
S
t
a
c
k
T
r
a
c
e
I
n
F
a
s
t
T
h
r
o
w
−
X
X
:
E
r
r
o
r
F
i
l
e
=
/
d
a
t
a
/
l
o
g
s
/
e
g
b
/
{APP_NAME}.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintPromotionFailure -XX:+PrintGCApplicationStoppedTime -XX:-UseBiasedLocking -XX:AutoBoxCacheMax=20000 -Djava.security.egd=file:/dev/./urandom -XX:+PrintCommandLineFlags -XX:-OmitStackTraceInFastThrow -XX:ErrorFile=/data/logs/egb/
APPNAME.log−XX:+PrintGCDetails−XX:+PrintGCDateStamps−XX:+PrintPromotionFailure−XX:+PrintGCApplicationStoppedTime−XX:−UseBiasedLocking−XX:AutoBoxCacheMax=20000−Djava.security.egd=file:/dev/./urandom−XX:+PrintCommandLineFlags−XX:−OmitStackTraceInFastThrow−XX:ErrorFile=/data/logs/egb/{APP_NAME}hs_err%p.log -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=5001 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8
jvisualvm
jvisualvm
minioClient/cosClient调用putObject上传接口时该方法里面都有自动关闭http连接的处理
看一下反编译的这段上传文件的代码
protected ObjectWriteResponse completeMultipartUpload(String bucketName..) throws InvalidBucketNameException... {
Multimap<String, String> queryParams = HashMultimap.create();
//...重点关注
Response response = this.execute(Method.POST, bucketName, objectName, ...);
Throwable var10 = null;
try {
String bodyContent = new String(response.body().bytes(), StandardCharsets.UTF_8);
bodyContent = bodyContent.trim();
....
} catch (Throwable var27) {
var10 = var27;
throw var27;
} finally {
if (response != null) {
if (var10 != null) {
try {
//...重点关注
response.close();
} catch (Throwable var24) {
var10.addSuppressed(var24);
}
} else {
//...重点关注
response.close();
}
个人实践
当我们的java应用运行时,突然出现内存占用暴增,说明系统中存在长期占用的对象无法回收,或者出现巨大的对象如何快速定位产生的大对象是什么?
1
内存,线程,cpu监控面板
dashboard
第一个*是类,第二个是方法名,-x是查看深度
trace org.springframework.web.servlet.DispatcherServlet * 【追踪调用链】
jad org.springframework.web.servlet.DispatcherServlet doDispatch 【反编译方法】
watch org.springframework.web.servlet.DispatcherServlet getHandler 'returnObj' 【监听方法】
watch org.lmj.redis.controller.* * '{params,returnObj}' -x 3 【查看出参入参】
OOM和Full GC必问(学jvm最终就是为了解决这两个问题以及排查死锁/影响性能的代码)
2–配了哪些参数
3-哪个tab看到哪个大对象造成了OOM
实践图:
大型项目线上不让用dump,那么你需要考虑oom错误难以排查,所消耗的大量找错的人力,时间,所付出的代价
detail不用搞,但是dump还是需要设置的