Java heap space ошибка как исправить

What is the solution?

In some cases, the amount of heap you have allocated to your JVM is just not enough to accommodate the needs of your applications running on that JVM. In that case, you should just allocate more heap – see at the end of this chapter for how to achieve that.

In many cases however, providing more Java heap space will not solve the problem. For example, if your application contains a memory leak, adding more heap will just postpone the java.lang.OutOfMemoryError: Java heap space error. Additionally, increasing the amount of Java heap space also tends to increase the length of GC pauses affecting your application’s throughput or latency.

If you wish to solve the underlying problem with the Java heap space instead of masking the symptoms, you need to figure out which part of your code is responsible for allocating the most memory. In other words, you need to answer these questions:

  1. Which objects occupy large portions of heap
  2. where these objects are being allocated in source code

At this point, make sure to clear a couple of days in your calendar (or – see an automated way below the bullet list). Here is a rough process outline that will help you answer the above questions:

  • Get security clearance in order to perform a heap dump from your JVM. “Dumps” are basically snapshots of heap contents that you can analyze. These snapshot can thus contain confidential information, such as passwords, credit card numbers etc, so acquiring such a dump might not even be possible for security reasons.
  • Get the dump at the right moment. Be prepared to get a few dumps, as when taken at a wrong time, heap dumps contain a significant amount of noise and can be practically useless. On the other hand, every heap dump “freezes” the JVM entirely, so don’t take too many of them or your end users start facing performance issues.
  • Find a machine that can load the dump. When your JVM-to-troubleshoot uses for example 8GB of heap, you need a machine with more than 8GB to be able to analyze heap contents. Fire up dump analysis software (we recommend Eclipse MAT, but there are also equally good alternatives available).
  • Detect the paths to GC roots of the biggest consumers of heap. We have covered this activity in a separate post here. It is especially tough for beginners, but the practice will make you understand the structure and navigation mechanics.
  • Next, you need to figure out where in your source code the potentially hazardous large amount of objects is being allocated. If you have good knowledge of your application’s source code you’ll be able to do this in a couple searches.

Alternatively, we suggest Plumbr, the only Java monitoring solution with automatic root cause detection. Among other performance problems it catches all java.lang.OutOfMemoryErrors and automatically hands you the information about the most memory-hungry data structres.

Plumbr takes care of gathering the necessary data behind the scenes – this includes the relevant data about heap usage (only the object layout graph, no actual data), and also some data that you can’t even find in a heap dump. It also does the necessary data processing for you – on the fly, as soon as the JVM encounters an java.lang.OutOfMemoryError. Here is an example java.lang.OutOfMemoryError incident alert from Plumbr:

Without any additional tooling or analysis you can see:

  • Which objects are consuming the most memory (271 com.example.map.impl.PartitionContainer instances consume 173MB out of 248MB total heap)
  • Where these objects were allocated (most of them allocated in the MetricManagerImpl class, line 304)
  • What is currently referencing these objects (the full reference chain up to GC root)

Equipped with this information you can zoom in to the underlying root cause and make sure the data structures are trimmed down to the levels where they would fit nicely into your memory pools.

However, when your conclusion from memory analysis or from reading the Plumbr report are that memory use is legal and there is nothing to change in the source code, you need to allow your JVM more Java heap space to run properly. In this case, alter your JVM launch configuration and add (or increase the value if present) the following:

The above configuration would give the application 1024MB of Java heap space. You can use g or G for GB, m or M for MB, k or K for KB. For example all of the following are equivalent to saying that the maximum Java heap space is 1GB:

Токсичная фраза №2: «А ты не можешь просто … »

О, эта фраза – одна из моих любимых. Еще раз представьте, что рассказываете кому-то из знакомых историю из своей жизни или описываете какую-то жизненную ситуацию.

И, как в любой хорошей истории, в вашей истории есть конфликт. В ней есть что-то, что главный герой должен преодолеть, чтобы она закончилась хорошо (вне зависимости от того, кто этот главный герой – вы или кто-то еще).

Представьте, что вы говорите что-то вроде: «Знаешь, я так устаю, когда прихожу вечером с работы, а мне нужно еще приготовить ужин для детей, а потом уложить их спать». Понятное дело, что вы говорите это в надежде на понимание и сочувствие нелегкой судьбе героя, но знаете, что получаете в ответ? «А ты не можешь просто попросить своего мужа приготовить ужин, пока ты едешь домой?»

Вы можете нарваться на подобный ответ практически в любой ситуации, когда на что-то жалуетесь:

«Мои сотрудники постоянно ворчат и жалуются, потому что никто из них не хочет работать по выходным».

«А ты не можешь просто сказать им, что будет или так, или никак, а если им не нравится, пусть поищут себе другую работу?»

«Знаешь, я так стараюсь сбросить эти последние три килограмма, но у меня никак не получается это сделать».

«А ты не можешь просто убрать еще больше углеводов из своего рациона и перестать есть после шести вечера?»

Получив вместо внимания и участия этот полубезразличный ответ, вы начинаете закипать внутри, словно чайник, мысленно говоря своему собеседнику: «А тебе не кажется, что будь у меня возможность «просто» сделать это, то мы бы сейчас об этом не разговаривали?»

И еще одна фраза, последняя…

Токсичная фраза №3: «Как твои дела, хорошо?»

Постойте, можете сказать вы. Как, с позволения сказать, простой вопрос о том, как у кого-то дела, может быть токсичной фразой?

И что она может сказать нам об эмоциональном интеллекте того, кто ее говорит?

Откровенно говоря, первые три слова этой фразы сами по себе не так уж и плохи, нам стоит остерегаться лишь этого «хорошо» в самом конце.

Когда кто-то спрашивает, как у вас дела, это может быть проявлением настоящего и неподдельного интереса к вашему благополучию… Если только в той же фразе вам не подсказывают единственный приемлемый для этого человека ответ. «Хорошо» в конце этой фразы говорит о том, что его совершенно не интересует, как у вас дела на самом деле, и ему нужен от вас лишь дежурный ответ, чтобы согласно кивнуть и выбросить вас из головы.

На самом деле дело не во мне, а в тебе

Несколько недель назад мне попалась отличная статья о том, как давать хорошие советы, и я внезапно осознал, что, кроме всего прочего, она позволяет оценить с точки зрения полезности советы, которые дают вам другие люди.

Как это сделать проще всего? Старайтесь замечать, сколько наводящих и уточняющих вопросов они задают перед тем, как что-то вам посоветовать.

Если они тратят немало времени на то, чтобы выяснить всю подноготную вашей ситуации, и задают кучу вопросов, чтобы понять, как проще и эффективнее всего помочь, это определенно является хорошим признаком

Безусловно, это не говорит о том, что вы должны следовать таким советам безоговорочно, но стоит как минимум принимать их во внимание

Но если они стараются как можно быстрее завершить разговор, прямо или опосредованно пытаясь сказать вам «Ну все, все, мы услышали достаточно – вам нужно сделать то-то и то-то», это говорит о том, что данные вам советы вряд ли окажутся особо полезными, так как людей, которые пытаются их дать, не очень-то интересует ваше мнение, жизненные обстоятельства и поможет ли вам их совет в принципе.

Но мы далеко не всегда ищем у других людей совета. Порою нам нужно нечто совершенно иное.

Короткий ответ

Существуют некоторые эффекты для значений данных или их статистических распределений неопределенности, например, сцинтилляционного устройства запуска первого или второго уровня, которое может происходить из невоспроизводимого количества времени, которое вам, возможно, придется ждать .

Худший аспект заключается в том, что они связаны не с физическим явлением, ни с аппаратным обеспечением, а с состоянием памяти (и ее историей).

В этом случае ваша цель состоит в том, чтобы восстановить исходную последовательность событий из данных, затронутых этими ошибками. Восстановленная / предполагаемая последовательность также будет подвержена ошибкам. Не всегда эта итерация приведет к сходимости в устойчивом решении; не сказано, что это будет правильным; Ваши данные больше не являются независимыми … Вы рискуете логическим коротким замыканием …

Найдите то, что вы можете ценить.

У вас может не быть того, что вы хотите. Вам могли причинить невероятную боль. Но есть множество вещей, которые вы можете ценить. Эпикур однажды сказал: «Не порти впечатление от того, что имеешь, желая того, чего у тебя нет. Помни о том, что когда-то ты лишь только надеялся получить то, чем обладаешь сейчас». Вспоминайте об этом тогда, когда жизнь кажется несправедливой.

Не забывайте благодарить за все простые и, казалось бы, обыденные подарки, что преподнесла вам жизнь. При помощи благодарности вы превращаете простое вокруг вас в невероятное.

Вот вопрос, над которым следует подумать: что, если бы завтра вы проснулись, имея только те вещи, за которые благодарны сегодня?

Вспомните о красоте, что вас окружает. Замечайте ее. Улыбайтесь.

Что бы ни случилось, делайте один шаг вперед, потом еще один и еще один.

Самые прекрасные улыбки, как правило, те, что рождаются сквозь слезы. Падения в конечном итоге ведут к взлетам.

Каждая ошибка, неудача и потеря уже сама по себе подводит к определенному решению. В каждой из них кроется урок, как можно стать лучше и получить желаемый результат в следующий раз.

Таким образом, самый надежный способ предсказать будущее – создавать его лично. Не сидите без дела, наблюдая за тем, как мимо проходит ваша жизнь. Принимайте в ней активное участие. Не позволяйте мелочам вне вашего контроля вмешиваться в общий ход дел и влиять на то, что вы можете контролировать.

Правда в том, что каждый из нас время от времени терпит неудачи. Но неудачи не определяют нас в целом. Выносите уроки из пройденных вами испытаний. Становитесь мудрее. Продолжайте в том же духе.

Токсичная фраза №1: «Я так тебя понимаю».

Представьте себе одну гипотетическую ситуацию… К примеру, вам пришлось столкнуться с какой-то неприятностью или трудностями на жизненном пути, и вы решили рассказать об этом коллеге, с которым проработали вместе несколько лет – не так уж важно, зачем. Может быть, вы нуждаетесь в доброжелательном совете

Возможно, вам хочется, чтобы вас поняли и посочувствовали.

А может, вам просто хочется выговориться.

Но после того, как вы рассказали о том, что происходит, человек, от которого ожидали внимания и понимания, отвечает вам короткой фразой из четырех слов: «Я так тебя понимаю».

А дальше возможны варианты. Возможно, этим все и ограничится, и этот человек отвернется от вас, вернувшись к своим делам. А может, он начнет в ответ рассказывать о своих проблемах и неприятностях, в лучшем случае имеющих лишь отдаленное сходство с тем, с чем пришлось столкнуться вам.

И вы начинаете спрашивать себя: «Не навязываюсь ли я этому человеку? Не выгляжу ли я нытиком? Не слишком ли затягиваю рассказы о своих проблемах?»

Ну как, знакомая ситуация? Если да, то не торопитесь с выводами и не спешите себя обвинять, мы вернемся к рассмотрению данной ситуации чуть позже.

18 ответов

В конечном итоге у вас всегда есть конечный максимум кучи для использования независимо от того, на какой платформе вы работаете. В Windows 32 бит это примерно 2GB (не куча, а общий объем памяти на процесс). Просто так получается, что Java решает уменьшить размер по умолчанию (предположительно, так, чтобы программист не мог создавать программы с распределенным выделением памяти, не сталкиваясь с этой проблемой и не проверяя, что именно они делают).

Таким образом, учитывая, что есть несколько подходов, которые вы можете использовать, чтобы определить, какой объем памяти вам нужен, или уменьшить объем используемой памяти. Одной из распространенных ошибок в языках сборки мусора, таких как Java или C #, является сохранение ссылок на объекты, которые вы больше не используете , или выделение множества объектов, когда вы можете использовать их вместо этого. Пока объекты имеют ссылку на них, они будут продолжать использовать пространство кучи, поскольку сборщик мусора не удалит их.

В этом случае вы можете использовать профилировщик памяти Java, чтобы определить, какие методы в вашей программе выделяют большое количество объектов, а затем определить, есть ли способ убедиться, что на них больше нет ссылок, или не выделять их в первое место. Одним из вариантов, который я использовал в прошлом, является «JMP» http://www.khelekore.org/jmp/ .

Если вы решите, что вы распределяете эти объекты по какой-то причине, и вам нужно хранить ссылки (в зависимости от того, что вы делаете, это может иметь место), вам просто нужно увеличить максимальный размер кучи, когда вы запускаете программа. Однако, как только вы выполните профилирование памяти и поймете, как распределяются ваши объекты, у вас должно быть лучшее представление о том, сколько памяти вам нужно.

В общем, если вы не можете гарантировать, что ваша программа будет работать в некотором конечном объеме памяти (возможно, в зависимости от размера ввода), вы всегда столкнетесь с этой проблемой. Только после исчерпания всего этого вам нужно будет изучить кэширование объектов на диск и т. Д. В этот момент у вас должна быть очень веская причина сказать «мне нужен Xgb памяти» для чего-то, и вы не сможете обойти это, улучшив ваши алгоритмы или шаблоны распределения памяти. Как правило, это будет иметь место только в случае алгоритмов, работающих с большими наборами данных (например, с базой данных или какой-либо программой научного анализа), и тогда становятся полезными такие методы, как кэширование и ввод-вывод в память.

Я в общем склеил всю музыку, которую хотел сделать фоновой, и вышло 315мб. Закинул в проект, и попытался с помощью запустить. Но не вышло( Код метода для проигрывания музыки:

Как это исправить? Пробовал увлеичить память, но мне ошибку выбивало, то ли памяти мало, то ли ещё что-то. Всего на компе 2гб ОЗУ.

Поддержка против переноса внимания

На самом деле есть два основных типа реакции людей на своих собеседников. Они могут либо поддерживать собеседника, стараясь, чтобы тема разговора не перескакивала с его жизненных обстоятельств и проблем, либо же переместить фокус внимания беседы на самих себя и того, что их интересует.

В общем и целом, люди с высоким эмоциональным интеллектом чаще всего используют в общении с другими людьми слова и выражения, говорящие об их поддержке собеседника. Люди же с низким эмоциональным интеллектом пытаются всеми возможными вербальными способами переключить тему беседы на себя, любимых (главным образом потому, что собственные проблемы и интересы занимают их куда больше, чем проблемы окружающих).

Давайте вернемся к приведенным выше примерам:

«Я так тебя понимаю»

Данная фраза пытается переключить наше внимание с попыток объяснить собеседнику свои чувства или проблемы на заявляемое им понимание того, что с нами происходит, даже если это совершенно не так (к тому же нам не стоит забывать о том, что, как говорится, чужая душа – потемки, и мы редко знаем по-настоящему, что чувствуют другие люди).

«Может, тебе просто?..» Эта фраза и вовсе стоит на первом месте в списке эгоистичных выражений, используемых людьми с эмоциональным интеллектом на уровне банановой кожуры. Она буквально пропитана самовлюбленностью, презрением и намеками на то, что ваша проблема на самом деле яйца выеденного не стоит, и ее можно решить в два счета, стоит вам воспользоваться предложенным вам легким и простым решением, которого вы, по всей видимости, почему-то не замечаете – не то, что ваш советчик!

«Как твои дела, хорошо?» Ну, а эти слова и вовсе говорят о том, что нас даже не хотят выслушать

Мы еще ничего не успели сказать, а нам уже дали понять, что собеседника совершенно не интересуют наши проблемы и жизненные обстоятельства, и указали на то, что хотят от нас услышать. Еще раз – собеседник переключил тему разговора на себя еще до того, как мы успели что-то сказать.

Сконцентрируйтесь на небольших исправлениях.

В стремлении получить незамедлительное вознаграждение, вы привносите в свою жизнь ненужные разочарования и боль. Если же вы решите относиться к каждому моменту, как к возможности немного усовершенствовать себя, результаты придут сами собой.

Когда все идет совсем не так, как хотелось бы, даже самое незначительное действие может иметь огромное значение.

Времена великих испытаний являются временами великих возможностей. Когда со всех сторон окружают проблемы, к вам приходят также и невероятно ценные уроки.

В моменты, когда все хорошо, легко стать заложником беспечности. Вы запросто забудете о том, на какие невероятные вещи способны и насколько находчивыми можете быть. Сделайте выбор в пользу упорства. Ежедневно вносите небольшие корректировки. Именно эти поправки приведут туда, где вы хотите оказаться в конечном итоге.

Give me an example

Trivial example

The first example is truly simple – the following Java code tries to allocate an array of 2M integers. When you compile it and launch with 12MB of Java heap space (java -Xmx12m OOM), it fails with the java.lang.OutOfMemoryError: Java heap space message. With 13MB Java heap space the program runs just fine.

Memory leak example

The second and a more realistic example is of a memory leak. In Java, when developers create and use new objects e.g. new Integer(5), they don’t have to allocate memory themselves – this is being taken care of by the Java Virtual Machine (JVM). During the life of the application the JVM periodically checks which objects in memory are still being used and which are not. Unused objects can be discarded and the memory reclaimed and reused again. This process is called Garbage Collection. The corresponding module in JVM taking care of the collection is called the Garbage Collector (GC).

Java’s automatic memory management relies on GC to periodically look for unused objects and remove them. Simplifying a bit we can say that a memory leak in Java is a situation where some objects are no longer used by the application but Garbage Collection fails to recognize it. As a result these unused objects remain in Java heap space indefinitely. This pileup will eventually trigger the java.lang.OutOfMemoryError: Java heap space error.

It is fairly easy to construct a Java program that satisfies the definition of a memory leak:

When you execute the above code above you might expect it to run forever without any problems, assuming that the naive caching solution only expands the underlying Map to 10,000 elements, as beyond that all the keys will already be present in the HashMap. However, in reality the elements will keep being added as the Key class does not contain a proper equals() implementation next to its hashCode().

As a result, over time, with the leaking code constantly used, the “cached” results end up consuming a lot of Java heap space. And when the leaked memory fills all of the available memory in the heap region and Garbage Collection is not able to clean it, the java.lang.OutOfMemoryError:Java heap space is thrown.

The solution would be easy – add the implementation for the equals() method similar to the one below and you will be good to go. But before you manage to find the cause, you will definitely have lose some precious brain cells.

Tools to investigate and fix OutOfMemoryError in Java

Java.lang.OutOfMemoryError is a kind of error that needs a lot of investigation to find out the root cause of the problem, which object is taking memory, how much memory it is taking or finding dreaded memory leak and you can’t do this without having knowledge of available tools in java space. Here I am listing out some free tools which can be used to analyze heap and will help you to find the culprit of the OutOfMemoryError

1. Visualgc

Visualgc stands for Visual Garbage Collection Monitoring Tool and you can attach it to your instrumented hotspot JVM. The main strength of visualgc is that it displays all key data graphically including class loader, garbage collection, and JVM compiler performance data.

The target JVM is identified by its virtual machine identifier also called as vmid. You can read more about visualgc and vmid options here.

2. jmap

The jmap tool is a command line utility comes with JDK6 and allows you to take a memory dump of the heap in a file. It’s easy to use as shown below:

jmap -dump:format=b,file=heapdump 6054

Here file specifies the name of the memory dump file which is «heap dump» and 6054 is PID of your Java progress. You can find the PDI by using «ps -ef” or windows task manager or by using the tool called «jps»(Java Virtual Machine Process Status Tool).

3. jhat

The jhat tool was earlier known as hat (heap analyzer tool) but it is now part of JDK6. You can use jhat to analyze heap dump file created by using «jmap«. The jhat is also a command line utility and you can run it from the cmd window as shown below:

jhat -J-Xmx256m heapdump

Here it will analyze the memory dump contained in file «heapdump». When you start jhat it will read this heap dump file and then start listening on HTTP port, just point your browser into port where jhat is listening by default 7000, and then you can start analyzing objects present in heap dump.

4. Eclipse memory analyzer

Eclipse memory analyzer (MAT) is a tool from the eclipse foundation to analyze the java heap dump. It helps to find classloader leaks and memory leaks and helps to minimize memory consumption. You can use MAT to analyze heap dump carrying millions of objects and it also helps you to extract suspects of memory leak. See here for more information.

What is java.lang.OutOfMemoryError in Java

of java.lang.VirtualMachineErrorout of memory in the heap

Tomcat to Solve OutOfMemoryError in PermGen Space

From tomcat > 6.0 onward tomcat provides a memory leak detection feature that can detect many common memory leaks on a web-app perspective e.g ThreadLocal memory leaks, JDBC driver registration, RMI targes, LogFactory, and Thread spawned by web-apps. 

You can check complete details on htp://wiki.apache.org/tomcat/MemoryLeakProtection you can also detect memory leaks by accessing the manager application that comes with tomcat, in case you are experiencing memory leak on any java web-app its a good idea to run it on tomcat.

Мы думаем, что нуждаемся в как можно большем количестве удобных, расслабленных дней.

Все мы мечтательно улыбаемся при мысли об удобном, спокойном и расслабленном дне. Устраивать себе такой день время от времени, чтобы отдохнуть и расслабиться, нормально, но если такими становятся все ваши дни… вряд ли вы скажете себе потом за это «спасибо».

Если честно, одним из самых распространенных деструктивных пристрастий в мире является пристрастие к комфорту. К чему стремиться к росту и развитию, если в вашем распоряжении уже есть 400 телевизионных каналов, YouTube и удобное кресло? Можно ведь просто купить себе чипсов, пива и отключаться так от проблем каждый вечер, верно?

НЕВЕРНО! Это не жизнь — это существование.

Жить — значит постоянно учиться чему-то новому и расти над собой с помощью как положительного, так и отрицательного опыта. Это значит постоянно задавать вопросы и искать ответы. И в нашей жизни полным-полно вопросов, на многие из которых просто нельзя дать быстрый или однозначный ответ. И лишь ваше желание задавать эти вопросы, и ваша смелость, позволяющая каждый день храбро идти вперед, в неизвестное, в поисках ответов на них придает вашей жизни смысл.

В конечном итоге выбор за вами. Вы можете либо провести всю жизнь, жалея себя, валяясь в относительном удобстве кресла, и спрашивая себя, почему этот мир так сложен и негостеприимен, или вы можете провести его, благодаря себя за то, что вы достаточно сильны, чтобы преодолеть все преграды, что встанут у вас на пути. Все зависит лишь от вашего образа мыслей. И очевидный первый шаг на пути к второму варианту — это убеждения себя в том, что вам нужно встать, взять себя в руки, и сделать все то, что нужно сделать, пусть даже это неприятно и неудобно.

Подумайте над этим…

  • Сколько раз за последний год психологическое стремление к комфорту не оставляло и камня на камне от ваших лучших намерений?
  • Сколько тренировок в спортзале вы пропустили потому, что ваш разум (а не ваше тело) говорило вам, что вы слишком устали, и лучше бы вам пойти домой отоспаться?
  • Сколько подходов к тренажерам вы пропустили потому, что ваш разум (а не ваше тело) говорило вам «Ты и так уже сделал девять подходов, десятый можно и пропустить»?

Большинство людей, отвечая на эти вопросы, только лишь за последний год с легкостью могут насчитать несколько десятков случаев. Я, кстати, не исключение. И эти вопросы можно, переработав, применить практически к любой сфере нашей жизни. Смысл их в том, что стремление к комфорту (вполне обычная слабость разума) в сочетании с отсутствием позитивных действий с легкостью сводит на нет весь наш потенциал. Когда мы избегаем дискомфорта, мы не можем добиться ничего достойного. Единственный способ избежать подобного состояния — ежедневная практика.

Чтобы ваш разум стал сильнее, его, как и мышцы, нужно тренировать. Чтобы он развивался и становился лучше, это нужно делать каждый день. И если вы не будете заставлять себя развиваться хотя бы в малом, если вы всегда будете избегать неудобств, вы почти наверняка в чем-то сломаетесь в те неизбежные дни, которые будут тяжелее обычных.

Вот тот принцип, по которому я живу, и по которому стоит жить и вам:

Чаще выбирайте для себя что-то полезное, хоть и неудобное. Пойдите в спортзал, даже когда удобнее было бы и дальше спать в кровати. Выберите сделать десять подходов, когда ваш разум твердит, что хватит и девяти. Выберите создание чего-то замечательного даже тогда, когда удобнее согласиться на что-то посредственное. Выберите поднять руку и задать вопрос, когда удобнее было бы молчать и дальше. Выберите отстаивание своих убеждений, когда куда удобнее было бы сдаться. Просто продолжайте доказывать себе в большом и малом, каждый день, изо дня в день, что в вас достаточно сил и решимости, чтобы встать с пола, войти на ринг, и сражаться за жизнь, которой вы должны жить.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: