这代码每按一次确定内存占用都涨大,为什么?

ottorz 2013-06-20 08:16:46

package main;

import java.awt.AWTException;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;

import javax.swing.JOptionPane;

@SuppressWarnings("deprecation")
public class openDialog {
private static Thread serviceThread;
private static boolean pause = false;
private static TrayIcon tuopan;
private static Image image;
private static PopupMenu menu;

private static MenuItem startItem;
private static MenuItem stopItem;
private static JOptionPane o = new JOptionPane();

static{
//初始化托盘菜单
{
startItem = new MenuItem("start Service");
stopItem = new MenuItem("stop service");

startItem.enable();
stopItem.disable();

startItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startService();
}
});
stopItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
pauseService();
}
});
menu = new PopupMenu();
menu.add(startItem);
menu.add(stopItem);
}

//初始化托盘
image = new Image() {

@Override
public ImageProducer getSource() {
// TODO Auto-generated method stub
return null;
}

@Override
public Object getProperty(String name, ImageObserver observer) {
// TODO Auto-generated method stub
return null;
}

@Override
public int getHeight(ImageObserver observer) {
// TODO Auto-generated method stub
return 0;
}

@Override
public Graphics getGraphics() {
// TODO Auto-generated method stub
return null;
}

@Override
public int getWidth(ImageObserver observer) {
// TODO Auto-generated method stub
return 0;
}


};

tuopan = new TrayIcon(image, "", menu);
try {
SystemTray.getSystemTray().add(tuopan);

} catch (AWTException e) {
e.printStackTrace();
}

//定义服务线程
serviceThread = new Thread(new Runnable() {
@SuppressWarnings("static-access")
@Override
public void run() {
while(true){
try {
while(pause){
continue;
}
startItem.disable();
stopItem.enable(true);
if(o.showConfirmDialog(null, "Service is running!Click cancel to pause.", "javaService", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE)==2){
pauseService();
startItem.enable();
stopItem.disable();
continue;
}
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
}
});
}

public static void main(String[] a){
serviceThread.start();
}
public static void showThreadStatus(){
System.out.println(serviceThread.getState());
}

public static void pauseService(){
pause = true;
}

public static void startService(){
pause = false;
}
}

...全文
218 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2013-06-21
  • 打赏
  • 举报
回复
后台服务和开机自启动程序,应该是两个概念。 后台服务,应该不具备GUI界面,只是做一些服务性质的事情。 至于GUI界面的展示功能。一般也是由后台服务程序,启动一个GUI展示进程,来完成的。 楼主不妨把你的程序,做成开机自启动的吧,后台服务,就先免了吧。
lcf 2013-06-21
  • 打赏
  • 举报
回复
sorry.. windows服务我不懂。。
ottorz 2013-06-21
  • 打赏
  • 举报
回复
引用 4 楼 herl1988 的回复:
[quote=引用 3 楼 lcf 的回复:] 这个程序已经不能再简单了,20多M很正常,UI就是这么耗内存。而且除了UI,还有JVM本身占用的内存。所以你不能指望Java能省多少内存。这也是Java和C++/C等语言的根本不同之处:内存不是你能完全掌控的。所以你要考虑的是你的程序最多能用多少内存,然后设置一个JVM的参数。对于Java程序来说,只要内存占用在一个合理的范围,就可以了。而不是每一时刻都盯住内存占用量,让它时刻保持在最低水平,这是不可能的。
我想把它做成windows服务,但每次启动服务后就关闭,不知道为什么? 安装的批处理文件是这样写的

if "%JAVA_HOME%" == "" set JAVA_HOME=D:\Program Files\Java\jdk1.7.0_02
set JVMDIR=%JAVA_HOME%\jre\bin\server
set JSBINDIR=%CD%
set JSEXE=%JSBINDIR%\JavaService.exe
set SSBINDIR=%JSBINDIR%

%JSEXE% -install MyService %JVMDIR%\jvm.dll -Djava.class.path=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%/lib/tools.jar;%SSBINDIR%\service -start main.openDialog
[/quote] javaservice.exe 、所有类 和 批处理文件都已经放在同个目录下
ottorz 2013-06-21
  • 打赏
  • 举报
回复
引用 3 楼 lcf 的回复:
这个程序已经不能再简单了,20多M很正常,UI就是这么耗内存。而且除了UI,还有JVM本身占用的内存。所以你不能指望Java能省多少内存。这也是Java和C++/C等语言的根本不同之处:内存不是你能完全掌控的。所以你要考虑的是你的程序最多能用多少内存,然后设置一个JVM的参数。对于Java程序来说,只要内存占用在一个合理的范围,就可以了。而不是每一时刻都盯住内存占用量,让它时刻保持在最低水平,这是不可能的。
我想把它做成windows服务,但每次启动服务后就关闭,不知道为什么? 安装的批处理文件是这样写的

if "%JAVA_HOME%" == "" set JAVA_HOME=D:\Program Files\Java\jdk1.7.0_02
set JVMDIR=%JAVA_HOME%\jre\bin\server
set JSBINDIR=%CD%
set JSEXE=%JSBINDIR%\JavaService.exe
set SSBINDIR=%JSBINDIR%

%JSEXE% -install MyService %JVMDIR%\jvm.dll -Djava.class.path=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%/lib/tools.jar;%SSBINDIR%\service -start main.openDialog
lcf 2013-06-21
  • 打赏
  • 举报
回复
这个程序已经不能再简单了,20多M很正常,UI就是这么耗内存。而且除了UI,还有JVM本身占用的内存。所以你不能指望Java能省多少内存。这也是Java和C++/C等语言的根本不同之处:内存不是你能完全掌控的。所以你要考虑的是你的程序最多能用多少内存,然后设置一个JVM的参数。对于Java程序来说,只要内存占用在一个合理的范围,就可以了。而不是每一时刻都盯住内存占用量,让它时刻保持在最低水平,这是不可能的。
ottorz 2013-06-21
  • 打赏
  • 举报
回复
引用 7 楼 preferme 的回复:
后台服务和开机自启动程序,应该是两个概念。 后台服务,应该不具备GUI界面,只是做一些服务性质的事情。 至于GUI界面的展示功能。一般也是由后台服务程序,启动一个GUI展示进程,来完成的。 楼主不妨把你的程序,做成开机自启动的吧,后台服务,就先免了吧。
弹出对话框只是做测试,我是想做一个服务,并不加入GUI,需要不登陆系统而自启动,但为什么服务无法启动呢,不知道是代码问题还是装服务时候的参数设置问题
ottorz 2013-06-21
  • 打赏
  • 举报
回复
引用 1 楼 lcf 的回复:
按了确定,只有Thread.sleep被执行了,过了5秒钟,pause是false,继续弹窗。 我猜测是弹窗的过程中Swing调用了很多东西,使用了一些内存,但是在关窗之后还没有被回收掉。你多弹几次,当Eden满了之后垃圾回收器会工作,内存占用就降下来了。
程序刚启动就占了20多m,感觉太大了,有优化地方吗?
冰思雨 2013-06-21
  • 打赏
  • 举报
回复
此外,楼主所展示的代码,并没有大量内存占用的信息。内存使用量的突增应该在其他代码当中。 楼主展示的代码,我只看到了某个情况下 CPU飙高的信息,多核CPU中某个单核会满负荷运转。
lcf 2013-06-20
  • 打赏
  • 举报
回复
按了确定,只有Thread.sleep被执行了,过了5秒钟,pause是false,继续弹窗。 我猜测是弹窗的过程中Swing调用了很多东西,使用了一些内存,但是在关窗之后还没有被回收掉。你多弹几次,当Eden满了之后垃圾回收器会工作,内存占用就降下来了。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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