Avatar billede semso Nybegynder
10. marts 2008 - 10:56 Der er 8 kommentarer

OutOfMemoryError : Java heap space

Jeg har lavet en application til at modtager og sender SMS-er. Den kan køre i ca. 24 tmer og senere hen få jeg fejlen. Denne application kan modtage en SMS behendler den og sender den til afsenderen. Den kan håndtere tingene med databasen og sender de updaterede SMS-er til afsenderen. Applicationen fungerer som det skal men problemet er at den kan ikke kører i lang tid.
Avatar billede semso Nybegynder
10. marts 2008 - 11:17 #1
Er der en som kan hjælpe.
Avatar billede di8leva Nybegynder
10. marts 2008 - 12:38 #2
OutOfMemoryError kan nästen altid avhjälpes ved at bruge Xmx og Xms.

Når du kör selve applikationen, gör det sådan her:

java -Xms256M -Xmx512M    (minst 256mb ram og max 512mb)
Avatar billede semso Nybegynder
10. marts 2008 - 13:24 #3
Det hjælper selvfølgelig men i det her tilfælde lækker vi hukommelse så det ville bare skubbe tiden indtil fejlen. Tak for forslaget. Hvis nogen eventuelt kender en applikation til nemt at kigge på memory inden i JVM-en kunne det være interessant.
Avatar billede arne_v Ekspert
11. marts 2008 - 03:15 #4
Bruger applikationen noget JNI ?
Avatar billede semso Nybegynder
14. marts 2008 - 12:00 #5
Ja , den bruges. Har en klasse som implementere en interfaces. En klasse som skal læse en SMS ud fra en modem, hvis den er ankomt skal implementeres en -IInboundMessageNotification-. Når der er en message så skal den håndteres og sendes tilbage til afsenderen. Der bruges kun en Gateway(en port). Skal ikke bruges flere ports.
(NBS. Jeg er en nyuddannet Data Matiker og er lige startet på en arbejde).
Avatar billede semso Nybegynder
14. marts 2008 - 12:03 #6
Grundet jeg siger at jeg er en nyuddanet er at jeg kommer måske ikke til at fastår helt en avanceret løsning eller en spørgsmol som går dybere ind i systemet.
Har brug for forklaring i forvejen.
Avatar billede arne_v Ekspert
15. marts 2008 - 01:40 #7
Det er umuligt at sige hvor problemet er uden at se koden.

Jeg vil anbefale at du starter med at kigge på JNI delen. Samspillet mellem
Java og C kan godt drille.
Avatar billede semso Nybegynder
18. marts 2008 - 09:53 #8
Den har ikke lengere problemmer med memoryError eller programet kan ikke køre i så lang tid. Fejlen er ved -DeadLock-. Her er error message:
Found one Java-level deadlock:
=============================
"Thread-13":
  waiting to lock monitor 0x02aa13bc (object 0x22eb9330, a java.util.ArrayList),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x02eead7c (object 0x22eb9468, a java.lang.Object),
  which is held by "Thread-13"

Java stack information for the threads listed above:
===================================================
"Thread-13":
        at org.smslib.Service.readMessages(Service.java:290)
        - waiting to lock <0x22eb9330> (a java.util.ArrayList)
        at com.ioc.ReadSmsApp$InboundNotification.process(ReadSmsApp.java:153)
        at org.smslib.modem.AModemDriver$AsyncNotifier.run(AModemDriver.java:686)
        - locked <0x22eb9468> (a java.lang.Object)
"Thread-0":
        at org.smslib.modem.AModemDriver.disconnect(AModemDriver.java:162)
        - waiting to lock <0x22eb9468> (a java.lang.Object)
        at org.smslib.modem.ModemGateway.stopGateway(ModemGateway.java:88)
        at org.smslib.Service$WatchDog.run(Service.java:972)
        - locked <0x22eb9330> (a java.util.ArrayList)

Found 1 deadlock.
Herfra er koden som jeg er i gang med:
READ MESSAGE:

package com.ioc;

import java.util.Date;
import java.util.ArrayList;
import java.util.StringTokenizer;

import java.util.*;
import org.smslib.*;
import org.smslib.modem.*;
/**
* ReadSmsApp reads messages that has been notified and reads with help of Inner classes
* and save them to the msgList
* @author SD *
*/

public class ReadSmsApp
{
    List<Object> msgList;
    Service srv;
    SerialModemGateway gateway;
    SendSmsApp sSmsApp = new SendSmsApp(srv, gateway);
   
    SMS messageFromCustomer = new SMS();
    SMS updatedMessage;
    DBConnection dbCon = new DBConnection();
    DbHandler dbHandler = new DbHandler(dbCon);
    /**
    * Constructor for SMS reading which have an Service and SerialModemGateway as parameters
    * @param srv
    * @param gateway
    */
    public ReadSmsApp(Service srv, SerialModemGateway gateway)
    {
        this.srv = srv;
        this.gateway = gateway;
    }
       
    public void readSms() throws Exception
    {               

            try
            {   
                msgList = new ArrayList<Object>();
                srv.readMessages(msgList, MessageClasses.ALL);
                if(!msgList.isEmpty())
                {
                    for(int i = 0; i < msgList.size(); i++)
                    {                   
                        InboundMessage msg = (InboundMessage) msgList.get(i);
                        srv.deleteMessage(msg);                           
                        String commandoAndGroup = msg.getText();
                        StringTokenizer tok = new StringTokenizer(commandoAndGroup, " ");
                        String commando = "";
                        String group = "";
                        String originator = msg.getOriginator();
                        if(originator.length() == 11 && originator.substring(0, 3).equals("+45"))
                        {               
                            System.out.println("SMS received from : " + originator);
                            String tlfNr = originator.substring(3);
                            boolean isMobail = dbHandler.mobailIsNotInDB(tlfNr);
                            System.out.println("Phone in database = " + isMobail);                       
                               
                            if(isMobail)
                            {                                       
                                while(tok.hasMoreTokens())
                                {
                                    Date date = msg.getDate();
                                    commando = tok.nextToken();
                                                           
                                    if(commando.equalsIgnoreCase("Tænd") || commando.equalsIgnoreCase("Sluk"))
                                    {
                                        group = tok.nextToken();
                                        if(!group.equalsIgnoreCase("AIRCON")||!group.equalsIgnoreCase("ELVARME")||
                                          !group.equalsIgnoreCase("INDELYS")||!group.equalsIgnoreCase("STROM")||
                                          !group.equalsIgnoreCase("VANDVARMER")||!group.equalsIgnoreCase("UDELYS")||
                                          !group.equalsIgnoreCase("TYVERIALARM")||!group.equalsIgnoreCase("BRANDALARM"))
                                        {
                                            System.out.println("Unknown group in SMS: " + msg.toString());
                                        //    srv.deleteMessage(msg);   
                                            break;
                                        }
                                        else
                                        {                                               
                                            messageFromCustomer.setMobailNr(tlfNr);
                                            messageFromCustomer.setTimeStamp(date);
                                            messageFromCustomer.setCommand(commando);
                                            messageFromCustomer.setGroup(group);
                                            updatedMessage = dbHandler.smsUpdateCommandInfo(messageFromCustomer);                               
                                            System.out.println("UPDATED MESSAGE FOR TÆND ELLER SLUK: \r\n" + updatedMessage);
                                            sSmsApp.sendSms(updatedMessage);
                                        }
                                       
                                    }
                                    else
                                    {
                                        if(commando.equalsIgnoreCase("Info"))
                                        {   
                                            messageFromCustomer.setMobailNr(tlfNr);
                                            messageFromCustomer.setTimeStamp(date);
                                            messageFromCustomer.setCommand(commando);                               
                                            updatedMessage = dbHandler.smsUpdateCommandInfo(messageFromCustomer);
                                            System.out.println("UPDATED MESSAGE FOR INFO: \r\n" + updatedMessage);
                                            sSmsApp.sendSms(updatedMessage);
                                //            srv.deleteMessage(msg);   
                                        }
                                        else
                                        {
                                            System.out.println("Unknown command in SMS: " + msg.toString());
                                    //        srv.deleteMessage(msg);   
                                            break;
                                        }
                                    }
                                }
                            }                           
                        }
                        gateway.deleteMessage(msg);
                    }
                }
                else
                {
                    System.out.println("Message List is empty");                               
                }
            }
            catch (Exception e)
            {
                System.out.println("Oops, some bad happened...HEEEEEEEEEEEEEEEEER");
                e.printStackTrace();
            }
    }
   
    public SerialModemGateway getGateway()
    {
        return this.gateway;
    }
  /**
    * Inner class that notify the unread messages read it and save it to the msgList
    * @author SD
    */
    public class InboundNotification implements IInboundMessageNotification
    {   
        public void process(String gatewayId, MessageTypes msgType, String memLoc, int memIndex)
        {
            List msgList;
            if (msgType == MessageTypes.INBOUND)
            {
                System.out.println(">>> New Inbound message detected from Gateway: " + gatewayId + " : " + memLoc + " @ " + memIndex);
                try
                {

                    // Read...
                    msgList = new ArrayList<Object>();
                    srv.readMessages(msgList, MessageClasses.ALL, gatewayId);
                    for (int i = 0; i < msgList.size(); i++)
                        System.out.println(msgList.get(i));
                    // ...and reply.
                    //for (int i = 0; i < msgList.size(); i ++)
                    //{
                    //    InboundMessage msg = (InboundMessage) msgList.get(i);
                    //    srv.sendMessage(new OutboundMessage(msg.getOriginator(), "Got it!"), gatewayId);
                    //}
                }
                catch (Exception e)
                {
                    System.out.println("Oops, some bad happened...");
                    e.printStackTrace();
                }
            }
            else if (msgType == MessageTypes.STATUSREPORT)
            {
                System.out.println(">>> New Status Report message detected from Gateway: " + gatewayId + " : " + memLoc + " @ " + memIndex);
            }   
           
        }
    }   
    /**
    * This method returns a list of inbounds messages
    * @return msgList
    */
    public List<Object> getMessageList()
    {
        return this.msgList;
    }
}


SEND MESSAGE
package com.ioc;

/**
*This class is responsible for sending the messages to customers. 
*/

import org.smslib.*;
import org.smslib.modem.SerialModemGateway;

public class SendSmsApp
{
   
    private OutboundMessage msg;
    private ReadSmsApp readSms = null;
    SerialModemGateway gateway;
   
    private Service srv;
//    OutboundNotification outbundNotification = new OutboundNotification();
   
    public SendSmsApp(Service srv, SerialModemGateway gateway)
    {       
        this.srv = srv;   
        this.gateway = gateway;
       
    }
   
   
    public void sendSms(SMS messageToCustomer) throws Exception
    {
//        OutboundNotification outbund = new OutboundNotification();
//        gateway.setOutboundNotification(outbundNotification);
        try
        {           
        //    msg = new OutboundMessage("61658672", "Info");
            String tlfNr = messageToCustomer.getMobail();
            msg = new OutboundMessage(tlfNr,messageToCustomer.toString());
            srv.queueMessage(msg);   
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }       
    }
    public class OutboundNotification implements IOutboundMessageNotification
    {
        public void process(String gatewayId, OutboundMessage msg)
        {
            try
            {
                System.out.println("Kommer du ikke her");
                System.out.println("Outbound handler called from Gateway: " + gatewayId);           
                srv.sendMessage(msg);
                System.out.println(msg);
            }
            catch(Exception e)
            { System.out.println("Exception HER");
                e.printStackTrace();
            }
        }
    }
}
  MAIN KLASSE:
package com.ioc;
import org.smslib.*;
import org.smslib.modem.*;
import com.ioc.ReadSmsApp.InboundNotification;
import com.ioc.SendSmsApp.OutboundNotification;
/**
* SMSApp class is main class for starting of application
* @author SD
*/
public class SMSApp
{   
   
    /**
    * main method to start application and initialising
    * @param args
    * @throws Exception
    */
    public static void main(String[] args) throws Exception
    {           
        Service srv = new Service();
        SerialModemGateway gateway = new SerialModemGateway("modem.com1", "COM1", 9600, "Siemens", "MC35i");   
        ReadSmsApp rSmsApp = new ReadSmsApp(srv, gateway);
        SendSmsApp sSmsApp = new SendSmsApp(srv, gateway);
       
        InboundNotification inboundNotification = rSmsApp.new InboundNotification();
        OutboundNotification outboundNotification = sSmsApp.new OutboundNotification();
        gateway.setInboundNotification(inboundNotification);       
        gateway.setOutboundNotification(outboundNotification);

        gateway.setInbound(true);
        gateway.setOutbound(true);
       
        gateway.setSimPin("0000");
               
        srv.addGateway(gateway);       
       
        while(true)
        {           
            try
            {
                srv.startService();
                System.out.println("START");
                rSmsApp.readSms();
                Thread.sleep(1000);
               
            }
            catch(Exception e)
            {
                srv.stopService();
                System.out.println("STOP");
            } 
        }       
    } 
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester