一个小程序,内存分析求助?

「已注销」 2014-09-10 03:17:19
加精
写了一个端口扫描程序,运行没问题,但是我发现刚开始几分钟,内存运行都很正常,堆内新生代累计到16M就转义到了Survivor区,然后被回收掉,图形成折线,但是一旦过了大约两分钟,Heap里面新生代大部分就开始不回收了,好像直接就扔到了Old Gen,不知道这是为什么,下面附上程序和截图
程序:
package com.demo.net;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.concurrent.*;

/**
* Created by louis on 2014/9/9.
*/
public class PortScanner {
private int corePoolSize=50;
private int maximumPoolSize=70;
private long keepAliveTime=5000;
private BlockingDeque<Runnable> workQueue=new LinkedBlockingDeque<Runnable>();
private ExecutorService threadPoolExecutor=new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,
TimeUnit.MILLISECONDS,workQueue);

public void scan(String ip,int start,int end){
if(!validate(ip)){
System.err.println("Ip format is illegal.");
return;
}
if(start<0||end>=(1<<16)){
System.err.println("The port number is illegal.");
return;
}
InetAddress inetAddress=null;
try {
inetAddress = InetAddress.getByName(ip);
if (!inetAddress.isReachable(5000)) {
System.err.println(inetAddress.getHostAddress() + " is not reachable.");
return;
}
} catch (IOException e) {
// e.printStackTrace();
}
for(int i=start;i<=end;i++){
while(workQueue.size()>maximumPoolSize){
try {
// System.out.println("Thread queue is too long,sleep 500 milliseconds.");
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
threadPoolExecutor.execute(new ScanWorker(inetAddress, i));
}
threadPoolExecutor.shutdown();
while (!threadPoolExecutor.isTerminated()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Done.");
}

private boolean validate(String ip){
if(ip==null||ip.length()==0) return false;
String[] array=ip.split("\\.");
if(array.length!=4) return false;
for(String str:array){
try {
int num=Integer.valueOf(str);
} catch (NumberFormatException e) {
return false;
}
}
return true;
}
private class ScanWorker implements Runnable{
InetAddress inetAddress;
int port;
public ScanWorker(InetAddress inetAddress,int port){
this.inetAddress=inetAddress;
this.port=port;
}
@Override
public void run() {
Socket socket = null;
try {

socket = new Socket(inetAddress, port);
//socket.setSoTimeout(1000);
String serviceName = getServiceName(socket.getPort());
System.out.println("Port:" + socket.getPort() + " ServiceName:" + serviceName + " Ip:" + inetAddress.getHostAddress());
} catch (IOException e) {
// e.printStackTrace();
} finally {
if (socket != null && !socket.isClosed()) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

private String getServiceName(int port) {
String name ;
switch (port) {
case 21:
name = "FTP";
break;
case 23:
name = "TELNET";
break;
case 25:
name = "SMTP";
break;
case 80:
name = "HTTP";
break;
case 110:
name = "POP";
break;
case 135:
name="RPC";
break;
case 139:
name = "netBIOS";
break;
case 443:
name = "HTTPS";
break;
case 1433:
name = "SQL server";
break;
case 3389:
name = "Terminal Service";
break;
case 1521:
name = "Oracle";
break;
case 8080:
name = "Tomcat";
break;
default:
name="Unknown";
}
return name;
}
}

public static void main(String[] args) {
PortScanner portScanner=new PortScanner();
portScanner.scan("192.168.0.20",1,65535);
// portScanner.scan("74.125.143.115",1,10000);
}
}





...全文
4583 69 打赏 收藏 转发到动态 举报
写回复
用AI写文章
69 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_37197589 2016-12-29
  • 打赏
  • 举报
回复
g还要验证码
JasonHix 2015-03-13
  • 打赏
  • 举报
回复
没忍住点开进来取取经
ttjxtjx 2015-02-25
  • 打赏
  • 举报
回复
jvisualvm,java自带的分析工具
ttjxtjx 2015-02-25
  • 打赏
  • 举报
回复
这个分析工具是什么,求名称
ctl71801 2015-01-28
  • 打赏
  • 举报
回复
我这边跑了一下 内存非常正常



跑了一段时间,old gen满了,一次full gc


加大内存跑了一次


我看你 class loader 2345 我这边加载都在400,是不是监控错应用了
huyang1227535935 2014-11-01
  • 打赏
  • 举报
回复
水军来了。。
q10640844 2014-10-31
  • 打赏
  • 举报
回复
很高深,不会,只能默默帮顶
twtiqfn 2014-10-20
  • 打赏
  • 举报
回复
好复杂的问题 啊,感觉有些难度啊,不会
sctianhu 2014-10-17
  • 打赏
  • 举报
回复
可能是线程开太多了。
如花他哥 2014-10-17
  • 打赏
  • 举报
回复
应该是多线程没处理好吧
-xice- 2014-10-17
  • 打赏
  • 举报
回复
这玩意貌似没人用java玩吧
luaihuangxi 2014-10-17
  • 打赏
  • 举报
回复
完全不懂事虾米东东
cthgxy 2014-10-17
  • 打赏
  • 举报
回复
求楼主检测工具软件
jpb_qd 2014-10-17
  • 打赏
  • 举报
回复
我是来学习的!
Wenern 2014-10-14
  • 打赏
  • 举报
回复
好复杂的赶脚。
七脉 2014-10-14
  • 打赏
  • 举报
回复
好高深的样子
cattpon 2014-10-13
  • 打赏
  • 举报
回复
看看方案是什么~
SuperCoderJz 2014-10-13
  • 打赏
  • 举报
回复
learning
hugh_z 2014-10-13
  • 打赏
  • 举报
回复
learning
CodeC 2014-10-13
  • 打赏
  • 举报
回复
只能耐心等待结果,祈祷祝福宝贝,希望今天宝贝能够摆脱折磨
加载更多回复(47)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧