Java 在spring mvc应用程序中查找内存泄漏

Java 在spring mvc应用程序中查找内存泄漏,java,eclipse,spring,hibernate,memory-leaks,Java,Eclipse,Spring,Hibernate,Memory Leaks,我最近做了,代码运行良好。然后,今天,我在eclipse中重新打开了这个项目,并选择了RunAs…RunonServer。应用程序似乎从eclipse控制台中运行的日志中完成了正常的加载过程,但在eclipse控制台中显示了以下错误消息,此时我本希望应用程序加载到浏览器中: Exception in thread "http-bio-8080-exec-3" java.lang.OutOfMemoryError: PermGen space 我也运行了以前的代码,并打开了一些blob文件,

我最近做了,代码运行良好。然后,今天,我在eclipse中重新打开了这个项目,并选择了RunAs…RunonServer。应用程序似乎从eclipse控制台中运行的日志中完成了正常的加载过程,但在eclipse控制台中显示了以下错误消息,此时我本希望应用程序加载到浏览器中:

Exception in thread "http-bio-8080-exec-3" java.lang.OutOfMemoryError: PermGen space  
我也运行了以前的代码,并打开了一些blob文件,但我不认为这导致了问题的出现,因为即使我在再次运行下面的代码之前关闭一切并重新启动计算机,这个错误仍然存在

我在谷歌上搜索了错误和关于内存泄漏的信息,比如将大量文件完全加载到内存中而不是使用输入流等。但是当我分析应用程序中的所有代码时,我找不到任何大的变量。我把代码贴在下面。请让我知道,如果有什么我应该补充,以帮助您找到问题

有人能告诉我内存泄漏在哪里吗

以下是链路控制器:

@Controller
public class LinkController {

    @RequestMapping(value="/")
    public ModelAndView mainPage() {return new ModelAndView("home");}

    @RequestMapping(value="/index")
    public ModelAndView indexPage() {return new ModelAndView("home");}

}
@Controller
@RequestMapping(value="/team")
public class TeamController {

    @Autowired
    private TeamService teamService;

    @RequestMapping(value="/add", method=RequestMethod.GET)
    public ModelAndView addTeamPage() {
            ModelAndView modelAndView = new ModelAndView("add-team-form");
            modelAndView.addObject("team", new Team());
            return modelAndView;
    }

    @RequestMapping(value="/add", method=RequestMethod.POST)
    public ModelAndView addingTeam(@ModelAttribute Team team) {
            ModelAndView modelAndView = new ModelAndView("home");
            teamService.addTeam(team);
            String message = "Team was successfully added.";
            modelAndView.addObject("message", message);
            return modelAndView;
    }

    @RequestMapping(value="/list")
    public ModelAndView listOfTeams() {
            ModelAndView modelAndView = new ModelAndView("list-of-teams");
            List<Team> teams = teamService.getTeams();
            modelAndView.addObject("teams", teams);
            return modelAndView;
    }

    @RequestMapping(value="/edit/{id}", method=RequestMethod.GET)
    public ModelAndView editTeamPage(@PathVariable Integer id) {
            ModelAndView modelAndView = new ModelAndView("edit-team-form");
            Team team = teamService.getTeam(id);
            modelAndView.addObject("team",team);
            return modelAndView;
    }

    @RequestMapping(value="/edit/{id}", method=RequestMethod.POST)
    public ModelAndView edditingTeam(@ModelAttribute Team team, @PathVariable Integer id) {
            ModelAndView modelAndView = new ModelAndView("home");       
            teamService.updateTeam(team);
            String message = "Team was successfully edited.";
            modelAndView.addObject("message", message);
            return modelAndView;
    }

    @RequestMapping(value="/delete/{id}", method=RequestMethod.GET)
    public ModelAndView deleteTeam(@PathVariable Integer id) {
            ModelAndView modelAndView = new ModelAndView("home");
            teamService.deleteTeam(id);
            String message = "Team was successfully deleted.";
            modelAndView.addObject("message", message);
            return modelAndView;
    }
}
以下是团队控制员:

@Controller
public class LinkController {

    @RequestMapping(value="/")
    public ModelAndView mainPage() {return new ModelAndView("home");}

    @RequestMapping(value="/index")
    public ModelAndView indexPage() {return new ModelAndView("home");}

}
@Controller
@RequestMapping(value="/team")
public class TeamController {

    @Autowired
    private TeamService teamService;

    @RequestMapping(value="/add", method=RequestMethod.GET)
    public ModelAndView addTeamPage() {
            ModelAndView modelAndView = new ModelAndView("add-team-form");
            modelAndView.addObject("team", new Team());
            return modelAndView;
    }

    @RequestMapping(value="/add", method=RequestMethod.POST)
    public ModelAndView addingTeam(@ModelAttribute Team team) {
            ModelAndView modelAndView = new ModelAndView("home");
            teamService.addTeam(team);
            String message = "Team was successfully added.";
            modelAndView.addObject("message", message);
            return modelAndView;
    }

    @RequestMapping(value="/list")
    public ModelAndView listOfTeams() {
            ModelAndView modelAndView = new ModelAndView("list-of-teams");
            List<Team> teams = teamService.getTeams();
            modelAndView.addObject("teams", teams);
            return modelAndView;
    }

    @RequestMapping(value="/edit/{id}", method=RequestMethod.GET)
    public ModelAndView editTeamPage(@PathVariable Integer id) {
            ModelAndView modelAndView = new ModelAndView("edit-team-form");
            Team team = teamService.getTeam(id);
            modelAndView.addObject("team",team);
            return modelAndView;
    }

    @RequestMapping(value="/edit/{id}", method=RequestMethod.POST)
    public ModelAndView edditingTeam(@ModelAttribute Team team, @PathVariable Integer id) {
            ModelAndView modelAndView = new ModelAndView("home");       
            teamService.updateTeam(team);
            String message = "Team was successfully edited.";
            modelAndView.addObject("message", message);
            return modelAndView;
    }

    @RequestMapping(value="/delete/{id}", method=RequestMethod.GET)
    public ModelAndView deleteTeam(@PathVariable Integer id) {
            ModelAndView modelAndView = new ModelAndView("home");
            teamService.deleteTeam(id);
            String message = "Team was successfully deleted.";
            modelAndView.addObject("message", message);
            return modelAndView;
    }
}
以下是WebAppConfig:

@Configuration
@ComponentScan("com.sprhib")
@EnableWebMvc
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
public class WebAppConfig {
    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
            dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
            dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
            dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
            return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
            LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
            sessionFactoryBean.setDataSource(dataSource());
            sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
            sessionFactoryBean.setHibernateProperties(hibProperties());
            return sessionFactoryBean;
    }

    private Properties hibProperties() {
            Properties properties = new Properties();
            properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
            properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
            return properties;        
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
            HibernateTransactionManager transactionManager = new HibernateTransactionManager();
            transactionManager.setSessionFactory(sessionFactory().getObject());
            return transactionManager;
    }

    @Bean
    public UrlBasedViewResolver setupViewResolver() {
            UrlBasedViewResolver resolver = new UrlBasedViewResolver();
            resolver.setPrefix("/WEB-INF/pages/");
            resolver.setSuffix(".jsp");
            resolver.setViewClass(JstlView.class);
            return resolver;
    }
}  
以下是团队:

@Entity
@Table(name="teams")
public class Team {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    private Integer rating;
    public Integer getId() {return id;}
    public void setId(Integer id) {this.id = id;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public Integer getRating() {return rating;}
    public void setRating(Integer rating) {this.rating = rating;}
}  
以下是TeamServiceImpl:

@Service
@Transactional
public class TeamServiceImpl implements TeamService {
    @Autowired
    private TeamDAO teamDAO;

    public void addTeam(Team team) {teamDAO.addTeam(team);}

    public void updateTeam(Team team) {teamDAO.updateTeam(team);}

    public Team getTeam(int id) {return teamDAO.getTeam(id);}

    public void deleteTeam(int id) {teamDAO.deleteTeam(id);}

    public List<Team> getTeams() {return teamDAO.getTeams();}

}  

您的应用程序中可能没有内存泄漏。当您多次重新部署应用程序时,服务器会出现问题,这最终会导致内存不足问题。不幸的是,在这一点上你所能做的就是重新启动一切,你的应用程序应该可以正常运行

看看哪种方法可以帮助您增加Java可用的内存,以便在遇到这个问题之前可以工作更长的时间


如果您想在Windows上更改tomcat实例的
JAVA选项
,您需要编辑文件
catalina.bat
,通常在
tomcat\u BASE/bin/catalina.bat

但是,我会调整您指定的选项。首先,如果指定
-XX:+cmsclasssUnloadingEnabled
,则不需要
-XX:+cmsclassWeapingEnabled

其次,要使
-XX:+cmsclasssUnloadingEnabled
生效,还必须指定
-XX:+useConMarkSweepGC

总之,编辑您的
TOMCAT_BASE/bin/catalina.bat
,并在脚本开头的
rem
语句块下(第99行附近的某个地方),添加以下行:

set JAVA_OPTS=-XX:MaxPermSize=128M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -Xms256m -Xmx512m
请记住,如果您需要更多的PermGen空间,请将
MaxPermSize
增加到更高的值,但不使用垃圾收集选项(
useConMarkSweepGC
CMSClassUnloadingEnabled
),您只是在延长不可避免的
java.lang.OutOfMemoryError:PermGen空间


希望这有帮助

你是说我应该在命令行上运行一些东西吗?如果是,我应该采取什么具体步骤?创建系统变量和运行命令行代码是我可以做的事情,但对我来说是新的,所以我需要明确的步骤。下面是我从链接中得到的信息:JAVA_OPTS-XX:MaxPermSize=128M-XX:+cmsclasssunloadingerabled-XX:+cmsclsegensweapingenabled这里有一些设置JAVA_OPTS的方法。显示了Tomcat中的一个示例,但是快速的Google搜索会为不同的操作系统和环境提供更多的选项。我在上面的原始帖子中添加了一个编辑,指定了我试图如何设置JAVA_OPTS变量。我正在运行Windows7和Tomcat7。在这种环境下,我应该具体做什么?试着看一下,尤其是这会一步一步地做。如果有人能用几行代码展示解决方案,那么这个人的答案将得到+1和学分。在您的服务器启动中,-XX:MaxPermSize的值是多少?@benjamin.d我不知道。我怎么知道?
set JAVA_OPTS=-XX:MaxPermSize=128M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -Xms256m -Xmx512m