# OutOfMemoryError Glassfish



## MR_UNIX (19. Jul 2014)

Moin Leute,

normalerweise sind meine Fehlerbeschreibungen (zumindest nach eigenem Ermessen ) nicht sonderlich kurz oder ähnliches, diesmal habe ich aber ein Problem, wo ich wirklich kaum einen Ansatzpunkt habe.

Ich schreibe momentan eine Webanwendung auf Basis des Spring Frameworks (mit Spring MVC) und nutze dort auch Hibernate - naja, ich möchte es zumindest nutzen. Nachdem ich nun ewig an der Integration von Hibernate in Spring rumgebastelt habe, weil ich doch recht neu bin im JEE Bereich, habe ich es nun mehr oder weniger geschafft. 

Seit ich meine Klasse "DBLayer" aber nun zu einer Spring Bean per "@Component" Annotation und einem entsprechenden Eintrag in einer XML-Config gemacht habe, will das Deployment an meinen lokalen Glassfish Test Server nicht mehr funktionieren.
Ich erhalte bei jedem Versuch die im Thread-Titel genannte Meldung und ich kann sie mir nicht erklären, weil die Applikation eigentlich nicht wirklich groß ist. Außerdem habe ich in der Run Configuration in IntelliJ IDEA bereits den JVM-Parameter "-Xmx1G" hinzugefügt. In meinem PC sind 8 GB RAM, daran sollte es also auch nicht scheitern.

Hat jemand eine Idee? Hier einfach mal den DBLayer (Getter/Setter und Imports weggekürzt):

```
@Component("dbLayer")
public class DBLayer {

	// We are a singleton
	private static DBLayer instance;
	
	private DriverManagerDataSource dataSource;
	private SQLDriver driver;

    // Some magic injections for Hibernate access
    @Autowired
    UserServiceImpl userService;
    @Autowired
    IntranetServiceImpl intranetService;

	public DBLayer() {
		this.dataSource = (DriverManagerDataSource) new ClassPathXmlApplicationContext("classpath:../spring/spring-database.xml").getBean("dataSource");
		
		try {
			this.driver = new SQLDriver(dataSource);
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public void createDisabledUser(final Registration registration) {
		try {
			// Generate the activation code
			String authString = registration.getEmail() + "-" + System.currentTimeMillis() + "-" + this.hashedPassword(registration.getPassword());
			final String authCode = this.authCode(authString);
			
			// Create the user
			User userToCreate = new User();
            userToCreate.setEnabled(false);
            userToCreate.setLastname(registration.getLastname());
            userToCreate.setName(registration.getName());
            userToCreate.setPassword(this.hashedPassword(registration.getPassword()));
            userToCreate.setUsername(registration.getEmail());

            userService.create(userToCreate);

			// Get the ID of the new user
			ResultSet idQueryResult = this.driver.executeSelect("SELECT `USER_ID` FROM `users` WHERE `USERNAME` = ?", registration.getEmail());
			String id;
			if (idQueryResult != null) {
				idQueryResult.next();
				id = idQueryResult.getString("USER_ID");
				
				// Set the user role
				this.driver.executeUpdate("INSERT INTO `user_roles` (`USER_ID`, `AUTHORITY`) VALUES (?, ?)",  id, "ROLE_ADMIN");
				
				// Create the activation
				this.driver.executeUpdate("INSERT INTO `awaiting_activation` (`USER_ID`, `authcode`) VALUES (?, ?)", id, authCode);
				
				// Send the email as asynchronous task
				AsyncTask mailTask = new AsyncTask() {
					
					@Override
					public void taskStub() {
						try {
							MailProvider mp = (MailProvider) new ClassPathXmlApplicationContext("classpath:../spring/spring-mail.xml").getBean("mailProvider");
							mp.sendConfirmationMail(registration, authCode);
						}
						catch (Exception ex) {
							ex.printStackTrace();
						}
					}
				};
				
				AsyncTaskExecutor.execute(mailTask);
			}
			else {
				System.err.println("SOMETHING WENT WRONG [DBLayer.createDisabledUser()]");
			}
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	public boolean userExists(String email) {
		try {
			ResultSet res = this.driver.executeSelect("SELECT * FROM `users` WHERE `USERNAME` = ?", email);
			if (res != null && res.next()) {
				return true;
			}
			
			return false;
		}
		catch (Exception ex) {
			ex.printStackTrace();
			
			return true;
		}
	}
	
	public boolean checkActivationAndSolve(String email, String code) {
		try {
            ResultSet idQuery = this.driver.executeSelect("SELECT user_id FROM users WHERE username = ?", email);
            String targetID = "";
            if (idQuery.next()) {
                targetID = idQuery.getString("user_id");
            }
			ResultSet res = this.driver.executeSelect("SELECT authcode, ACTIVATION_ID FROM awaiting_activation WHERE USER_ID = ?",  targetID);
			if (res != null && res.next()) {
				String authID = res.getString("ACTIVATION_ID");
				String targetCode = res.getString("authcode");

                if (code.equals(targetCode)) {
					this.driver.executeUpdate("DELETE FROM `awaiting_activation` WHERE `ACTIVATION_ID` = ?", authID);
					this.driver.executeUpdate("UPDATE `users` SET `enabled` = 1 WHERE `USER_ID` = ?", targetID);

                    this.createIntranet(targetID);

					return true;
				}
			}
			return false;
		}
		catch (Exception ex) {
			ex.printStackTrace();
			return false;
		}
	}

    public void createIntranet(String userId) {
        User user = userService.findById(userId);
        Intranet newIntranet = new Intranet();

        // Set placeholder data for the new intranet
        newIntranet.setCompanyName("Example Company");
        ArrayList<User> employees = new ArrayList<User>();
        employees.add(user);
        newIntranet.setEmployees(employees);
        newIntranet.setOwner(user);
        newIntranet.setSetUp(false);

        intranetService.create(newIntranet);
    }
	
	private String hashedPassword(String pass) throws Exception {
		return Tool.byteArrayToHexString(MessageDigest.getInstance("SHA-256").digest(pass.getBytes()));
	}
	
	private String authCode(String authString) throws Exception {
		return Tool.byteArrayToHexString(MessageDigest.getInstance("SHA-256").digest((authString + (System.currentTimeMillis() >> 2)).getBytes()));
	}
}
```

Wie man am DBLayer sieht, ist auch noch nicht alles auf Hibernate umgestellt, ich arbeite aber noch daran. 

Ich wäre euch wirklich dankbar, wenn ihr die zündende Idee in den Raum - oder Thread - werfen würdet. Wenn andere Codeschnipsel benötigt werden, kann ich die natürlich auch gerne nachreichen, einfach Bescheid sagen.

Vielen Dank und ein schön warmes Wochenende


----------



## MR_UNIX (20. Jul 2014)

So, bisher offensichtlich noch keine Erkenntnisse eurerseits, ich habe aber mal weitergeforscht. Da er ja sagt "OutOfMemory", hab ich mal VisualVM auf GlassFish angesetzt und während des Deployments (was immer noch fehlschlägt) den Monitor bzw. speziell den Graphen zum Heap begutachtet.

Ergebnis: Screenshot by Lightshot - er stößt an keine Grenze, was aber komisch ist, dass der Max Space kurz einbricht. Ist das normal? Habe mich damit noch nicht genauer beschäftigt.


----------

