2017-08-18 2 views
2

Je sais qu'il y a beaucoup de questions sur java.lang.OutOfMemoryError: Java heap space.Comment résoudre java.lang.OutOfMemoryError: espace de tas Java sans augmenter la taille de mémoire tas

comme question 1

Mais aucun des liens ne sont pas des réponses appropriées à ma question.

Nous générons des rapports au format tableur, où des données énormes proviennent de la base de données. Nous avons augmenté la taille de la mémoire de tas de 2 Go à 4 Go, pas d'utilisation.

Peut être à cause d'un espace supplémentaire dans la colonne de base de données, donc je parés tous les getters et setters en utilisant la méthode trim(), cela est également inutile.

Exemple:

String s = "Hai  "; 
s.trim(); 

Si quelqu'un ayant comment résoudre ce problème de côté de codage Java, sans augmenter la taille de l'espace de tas. Parce que le client l'a dit, il n'augmentera plus l'espace du tas.

Lorsque vous appelez cette méthode obtenir exception

private CrossTabResult mergeAllListsSameNdc(CrossTabResult crt, CrossTabResult res) { 

     crt.setFormularyTier(crt.getFormularyTier()==null ? "":((crt.getFormularyTier().contains(crt.getListId())? crt.getFormularyTier(): crt.getListId()+crt.getFormularyTier()) +"~"+res.getListId()+res.getFormularyTier())); 
     crt.setFormularyTierDesc(crt.getFormularyTierDesc()==null ? "":((crt.getFormularyTierDesc().contains(crt.getListId())? crt.getFormularyTierDesc(): crt.getListId()+crt.getFormularyTierDesc()) +"~"+res.getListId()+res.getFormularyTierDesc()));} 

ne peut pas partager plus de code, en raison de la confidentialité. En regardant le code ci-dessus, si vous avez une solution alternative, informez-moi. Nous fusionnons deux String basé sur le même id.

+1

Pourriez-vous fournir plus de code? – notanormie

+2

Essayez d'amener les données par lots. Je suppose que pour rencontrer ce problème, vous devez obtenir toutes les données en un seul coup de la base de données à votre serveur d'applications. – alexd

+0

@notanormie J'ai édité la question avec l'exemple de code. –

Répondre

2

We are generating reports in spreadsheet format, where huge data is coming from database side.

Dans ce genre de cas d'utilisation, vous avez au moins deux choses à étudier qui peuvent améliorer la mémoire consommée, mais vous devez d'abord identifier les coupables.

Principalement causes identifiées par des outils de surveillance dans ce cas d'utilisation sont généralement:

1) Si les données chargées à partir de la base de données est identifié comme un gros consommateur de mémoire, vous ne devriez probablement pas charger toutes les données d'un seul coup.
Garder tous ces objets en mémoire et en même temps créer la feuille de calcul à partir de ces données peut consommer beaucoup de mémoire.
Généralement si l'application est utilisée parallèlement pour d'autres cas d'utilisation. Vous devriez plutôt diviser la récupération en plusieurs récupérations.
Puis appelez-en un pour récupérer certains objets, remplir le spreadsheat et libérer ces objets comme n'étant plus nécessaires. Et ainsi de suite ...

2) Lors de la création de la feuille de calcul, si la feuille de calcul créée avec la bibliothèque était identifiée comme grande consommatrice de mémoire, vous devriez privilégier l'API de streaming ou l'API événementielle l'ensemble de la feuille de calcul en mémoire.
Par exemple, POI fournit une API de type DOM: XSSF et une API de diffusion en continu: SXSSF.
Vous ne spécifiez pas l'utilisation de la bibliothèque pour créer la feuille de calcul, mais cela n'a pas d'importance car la logique à utiliser doit être la même pour tous.

+0

Je suis d'accord pour le premier point. Mais maintenant le code est passé au niveau de la production, maintenant nous ne pouvons pas changer la structure des données correctement. –

+2

@ArvindKatte, eh bien, si vous ne changez rien, rien ne sera réparé. –

+0

Aujourd'hui, nous avons un appel avec les clients, voyons quelle approche ils vont mettre en jachère. –