最近开发一套暴力破解程序,放在服务器上跑,发现过一两天就会报堆内存溢出: java.lang.OutOfMemoryError: Java heap space;现在针对这个问题使用Jvisualvm 进行分析;下图是破解程序结构图:
本文章从以下两方面进行描述:
- Jvisualvm 运行时间 分析
- Jvisualvm 运行内存 分析
Jvisualvm 运行时间 分析
设置一:任务 task:100,休眠 time: 3 S; 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
static
void crack() {
double loop = Math.pow(params.length, bit);
List paramList =
new
ArrayList();
paramList.add(0);
for
(int i = 0; i < loop; i++) {
if
(i!=0&&i%100==0){
try
{
System.out.println(
"**************"
+concat(paramList));
Thread.sleep(3000);
}
catch
(InterruptedException ex){
ex.printStackTrace();
}
}
detect(i, paramList);
if
(request(paramList)) {
break
;
}
}
}
|
线程监控: 破解花时间: trash count-pwd: 10-000 | spend time:134235 设置二:任务 task:50,休眠 time: 3 S; 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
static
void crack() {
double loop = Math.pow(params.length, bit);
List paramList =
new
ArrayList();
paramList.add(0);
for
(int i = 0; i < loop; i++) {
if
(i!=0&&i%50==0){
try
{
System.out.println(
"**************"
+concat(paramList));
Thread.sleep(3000);
}
catch
(InterruptedException ex){
ex.printStackTrace();
}
}
detect(i, paramList);
if
(request(paramList)) {
break
;
}
}
}
|
线程监控:破解花时间: trash count-pwd: 10-000 | spend time:244678 由以上测试分析:task=100 时,线程pool-1-thread 不中断执行,而task=50时,线程都出现等待状态,所以 最适合任务数task count 在:50-100之间;下面在此基础上对内存进一步分析;
Jvisualvm 运行内存 分析
设置三:任务 task:80,休眠 time: 3 S; 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
static
void crack() {
double loop = Math.pow(params.length, bit);
List paramList =
new
ArrayList();
paramList.add(0);
for
(int i = 0; i < loop; i++) {
if
(i!=0&&i%80==0){
try
{
System.out.println(
"**************"
+concat(paramList));
Thread.sleep(3000);
}
catch
(InterruptedException ex){
ex.printStackTrace();
}
}
detect(i, paramList);
if
(request(paramList)) {
break
;
}
}
}
|
线程监控:抽样器监控:破解花时间: trash count-pwd: 10-000 | spend time:137321 设置四:任务 task:90,休眠 time: 3 S; 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
static
void crack() {
double loop = Math.pow(params.length, bit);
List paramList =
new
ArrayList();
paramList.add(0);
for
(int i = 0; i < loop; i++) {
if
(i!=0&&i%90==0){
try
{
System.out.println(
"**************"
+concat(paramList));
Thread.sleep(3000);
}
catch
(InterruptedException ex){
ex.printStackTrace();
}
}
detect(i, paramList);
if
(request(paramList)) {
break
;
}
}
}
|
线程监控:抽样器监控:破解时间: trash count-pwd: 10-000 | spend time:129327
通过以上四次不同测试,用Jvisualvm 线程模块与抽样器模块监控 得出:最后一次测试,任务 task:90,时间 time:3S ,花费时间:约129S,是性能最优的;
通过最后两次抽样器监控发现,task=90,time=3S时,Crack$Task实例数为 649,并且持续上升,进过一段时间,由于任务生产速度大于任务消费速度:V1>V2,慢慢会导致内存占用过度,发生内存溢出!这也是程序放在服务器上运行几天突然:java.lang.OutOfMemoryError: Java heap space 原因;
所以一定要限制任务生产速度小于等于任务消费速度V1<=V2,因此第三次测试:task: 80,time: 3S 是可行方案;
【导读】使用Jvisualvm 对暴力破解视频 进行性能优化,通过监视、线程、抽样器功能对Crack程序的运行状态、内存状态进行有效监控分析;
最近开发一套暴力破解程序,放在服务器上跑,发现过一两天就会报堆内存溢出: java.lang.OutOfMemoryError: Java heap space;现在针对这个问题使用Jvisualvm 进行分析;下图是破解程序结构图:
本文章从以下两方面进行描述:
- Jvisualvm 运行时间 分析
- Jvisualvm 运行内存 分析
Jvisualvm 运行时间 分析
设置一:任务 task:100,休眠 time: 3 S; 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
static
void crack() {
double loop = Math.pow(params.length, bit);
List paramList =
new
ArrayList();
paramList.add(0);
for
(int i = 0; i < loop; i++) {
if
(i!=0&&i%100==0){
try
{
System.out.println(
"**************"
+concat(paramList));
Thread.sleep(3000);
}
catch
(InterruptedException ex){
ex.printStackTrace();
}
}
detect(i, paramList);
if
(request(paramList)) {
break
;
}
}
}
|
线程监控: 破解花时间: trash count-pwd: 10-000 | spend time:134235 设置二:任务 task:50,休眠 time: 3 S; 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
static
void crack() {
double loop = Math.pow(params.length, bit);
List paramList =
new
ArrayList();
paramList.add(0);
for
(int i = 0; i < loop; i++) {
if
(i!=0&&i%50==0){
try
{
System.out.println(
"**************"
+concat(paramList));
Thread.sleep(3000);
}
catch
(InterruptedException ex){
ex.printStackTrace();
}
}
detect(i, paramList);
if
(request(paramList)) {
break
;
}
}
}
|
线程监控:破解花时间: trash count-pwd: 10-000 | spend time:244678 由以上测试分析:task=100 时,线程pool-1-thread 不中断执行,而task=50时,线程都出现等待状态,所以 最适合任务数task count 在:50-100之间;下面在此基础上对内存进一步分析;
Jvisualvm 运行内存 分析
设置三:任务 task:80,休眠 time: 3 S; 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
static
void crack() {
double loop = Math.pow(params.length, bit);
List paramList =
new
ArrayList();
paramList.add(0);
for
(int i = 0; i < loop; i++) {
if
(i!=0&&i%80==0){
try
{
System.out.println(
"**************"
+concat(paramList));
Thread.sleep(3000);
}
catch
(InterruptedException ex){
ex.printStackTrace();
}
}
detect(i, paramList);
if
(request(paramList)) {
break
;
}
}
}
|
线程监控:抽样器监控:破解花时间: trash count-pwd: 10-000 | spend time:137321 设置四:任务 task:90,休眠 time: 3 S; 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
static
void crack() {
double loop = Math.pow(params.length, bit);
List paramList =
new
ArrayList();
paramList.add(0);
for
(int i = 0; i < loop; i++) {
if
(i!=0&&i%90==0){
try
{
System.out.println(
"**************"
+concat(paramList));
Thread.sleep(3000);
}
catch
(InterruptedException ex){
ex.printStackTrace();
}
}
detect(i, paramList);
if
(request(paramList)) {
break
;
}
}
}
|
线程监控:抽样器监控:破解时间: trash count-pwd: 10-000 | spend time:129327
通过以上四次不同测试,用Jvisualvm 线程模块与抽样器模块监控 得出:最后一次测试,任务 task:90,时间 time:3S ,花费时间:约129S,是性能最优的;
通过最后两次抽样器监控发现,task=90,time=3S时,Crack$Task实例数为 649,并且持续上升,进过一段时间,由于任务生产速度大于任务消费速度:V1>V2,慢慢会导致内存占用过度,发生内存溢出!这也是程序放在服务器上运行几天突然:java.lang.OutOfMemoryError: Java heap space 原因;
所以一定要限制任务生产速度小于等于任务消费速度V1<=V2,因此第三次测试:task: 80,time: 3S 是可行方案;