Java lang outofmemoryerror unable to create new native thread

How to fix java.lang.OutOfMemoryError: unable to create new native thread [Solution]

There are several types of OutOfMemoryError in Java e.g. OutOfMemoryError related to Java heap space and permgen space, and a new one coming in Java 8, Java.lang.OutOfMemoryError: Metaspace. Each and every OutOfMemoryError has its own unique reason and corresponding unique solution. For example, java.langOutOfMemoryError: Java Heap Space comes when the application has exhausted all heap memory and tries to create an object which requires further memory allocation, At that time JVM throws this error to tell the application that it’s not possible to create an object.
Similarly java.lang.OutOfMemoryError: PermGen Space comes when there is no more memory in permgen space and the application tries to load more classes (as class metadata is stored in this area) or tries to create a new String (because prior to Java 7 String pool has also existed on permgen space).

We have already seen how to solve those nightmarish errors and today we will see another nightmare of Java developer, Java.lang.OutOfMemoryError: unable to create a new native thread , this is rather rare for core Java developers but if you have been involved in web and enterprise Java development, you would have seen it on web servers like tomcat and jetty, and enterprise servers like JBoss, WebLogic, and Glassfish.

Читайте также:  Get xml response php

As the error message «java.lang.OutOfMemoryError: unable to create new native thread» suggests it comes when your application tries to create more and more threads and exhausted the limit imposed by your Server.

The name «native» has a special significance in this error message because when you create a thread, JVM also creates a native thread (native to the operating system like Windows, Linux, Solaris, or Mac OSX), and when JVM fails to create a native thread in response to new Thread(), it throws «java.lang.OutOfMemoryError: unable to create new native thread». In Linux, you can check a number of native threads created by a process by using the ps -eLF | grep java | we -l command.

Btw, If you are serious about mastering JVM and Java performance in-depth then you can also check out Java Application Performance and Memory Management course by Matt Greencroft. It’s a great course for experienced Java developers.

When Java.lang.OutOfMemoryError: unable to create new native thread Comes

When I first see this error in one of our Java application I was surprised because it was a simple core Java application which receives the message, process it, and then sends it to another queue. I know for sure that we cannot spawn so many threads to hit this limit because it’s usually very large e.g. around 30K in Linux.

We attached our application with JConsole and leave it running for a week, the error was true as our application has a thread leak. It was unnecessary creating a new thread to process a new message and those threads just keep running because of the message processing loop.

Читайте также:  Python округление float до int

In short, there is nothing fancy about this error, if you keep creating threads, eventually you will hit the limit allowed by Operating System to a process and then JVM will not be able to create new native threads and it will throw «java.lang.OutOfMemoryError: unable to create new native thread». Now, the limit is something that depends on OS e.g. it would be different on Windows than Linux and vice-versa.

In UNIX, you can check this limit by using the «ulimit» command as shown below:

$ ulimit -a max user processes (-u) 1024

You can see by default number of processes per users is 1024, but you can increase the limit again by using the ulimit command as shown below:

This is also one of the easiest solutions to this problem. In order to learn about this error and in general about how to troubleshoot performance issues in Java, I would suggest reading a good book on Java profiling and performance like Java Performance The Definitive Guide By Scott Oaks. This will give you enough knowledge about tools and processes to deal with such errors in real-world Java applications.

How to fix java.lang.OutOfMemoryError: unable to create new native thread

java.lang.OutOfMemoryError: unable to create new native thread — Solution

This error is a clear case of resource exhaustion. If you think that 1024 threads are too few for your process you can certainly avoid this error by increasing the limit by using the ulimit command as shown above, at least in Linux.

There are similar solutions available for other operating systems but just like we can increase heap to avoid the java.lang.OutOfMemoryError: Java Heap Space , you can also avoid «java.lang.OutOfMemoryError: unable to create new native thread» error.

If you think that 1024 is too many threads for your application but you are still getting this error then this is a clear case of thread leak in your Java application. In order to find the thread leak, you need to find the code which is creating threads and carefully review it to avoid the situation I have explained in the last paragraph.

You can use the jConsole or plain UNIX commands to monitor a number of threads spawned by your process. Alternatively, you can also join these JVM and Java performance Tuning courses to learn more about how to monitor and profile Java applications.

Btw, if you are not sure about the limit in your operating system, you can run the following Java program to find exactly when your JVM will throw «java.lang.OutOfMemoryError: unable to create new native thread» error.

This program does, nothing but creates threads and put them into sleep for a couple of hours. The program will eventually throw this error and you can check the count just before that to find out how many threads are allowed to your JVM on your machine.

/* * Java Program to check when JVM will throw * "java.lang.OutOfMemoryError: unable to create new native thread" error. */ public class ThreadLimitChecker< public static void main(String[] args) < int count = 0; while (true) < count++; new Thread(new Runnable() < public void run() < try < Thread.sleep(10000000); > catch (InterruptedException e) < >> >).start(); System.out.println("Thread #:" + count); > > >

That’s all about how to solve Java.lang.OutOfMemoryError: unable to create a new native thread in Java. As I said this is a rather uncommon error but it’s good to know how to solve it. As a senior Java developer, you are bound to see such kind of performance-related problems in production and you should know how to deal with them.

  • How to solve java.sql.BatchUpdateException: String or binary data would be truncated (guide)
  • How to solve java.lang.ClassNotFoundException: com.mysql.jdbc. Driver error? (hint)
  • How to fix ‘javac’ is not recognized as an internal or external command (solution)
  • How to avoid ConcurrentModificationException in Java? (tutorial)
  • How to connect to MySQL database in Java? (tutorial)
  • How to solve «could not create the Java virtual machine» error in Java? (solution)
  • java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory error (solution)
  • Common reasons of java.lang.ArrayIndexOutOfBoundsException in Java? (solution)
  • java.lang.ClassNotFoundException : org.Springframework.Web.Context.ContextLoaderListener (solution)
  • java.sql.SQLServerException: The index 58 is out of range — JDBC (solution)
  • How to fix Caused By: java.lang.NoClassDefFoundError: org/apache/log4j/Logger (solution)
  • How to fix «illegal start of expression» compile time error in Java? (tutorial)
  • How to fix «Error: Could not find or load main class» in Eclipse? (guide)
  • 10 common reasons of java.lang.NumberFormatException in Java? (tutorial)
  • How to solve «variable might not have initialized» compile time error in Java? (answer)
  • Fixing java.lang.unsupportedclassversionerror unsupported major.minor version 50.0 (solution)
  • How to solve java.lang.OutOfMemoryError: Java Heap Space in Eclipse, Tomcat? (solution)
  • Cause and solution of «class, interface, or enum expected» compiler error in Java? (fix)
  • java.sql.SQLException: No suitable driver found for ‘jdbc:mysql://localhost:3306/mysql [Solution]
  • How to solve java.lang.classnotfoundexception oracle.jdbc.driver.oracledriver? (solution)

Источник

Какие бывают типы OutOfMemoryError или из каких частей состоит память java процесса

Если вы словили OutOfMemoryError, то это вовсе не значит, что ваше приложение создает много объектов, которые не могут почиститься сборщиком мусора и заполняют всю память, выделенную вами с помощью параметра -Xmx. Я, как минимум, могу придумать два других случая, когда вы можете увидеть эту ошибку. Дело в том, что память java процесса не ограничивается областью -Xmx, где ваше приложение программно создает объекты.

image

Область памяти, занимаемая java процессом, состоит из нескольких частей. Тип OutOfMemoryError зависит от того, в какой из них не хватило места.

1. java.lang.OutOfMemoryError: Java heap space

Не хватает место в куче, а именно, в области памяти в которую помещаются объекты, создаваемые программно в вашем приложении. Размер задается параметрами -Xms и -Xmx. Если вы пытаетесь создать объект, а места в куче не осталось, то получаете эту ошибку. Обычно проблема кроется в утечке памяти, коих бывает великое множество, и интернет просто пестрит статьями на эту тему.

2. java.lang.OutOfMemoryError: PermGen space

Данная ошибка возникает при нехватке места в Permanent области, размер которой задается параметрами -XX:PermSize и -XX:MaxPermSize. Что там лежит и как бороться с OutOfMemoryError возникающей там, я уже описал подробнейшим образом тут.

3. java.lang.OutOfMemoryError: GC overhead limit exceeded

Данная ошибка может возникнуть как при переполнении первой, так и второй областей. Связана она с тем, что памяти осталось мало и GC постоянно работает, пытаясь высвободить немного места. Данную ошибку можно отключить с помощью параметра -XX:-UseGCOverheadLimit, но, конечно же, её надо не отключать, а либо решать проблему утечки памяти, либо выделять больше объема, либо менять настройки GC.

4. java.lang.OutOfMemoryError: unable to create new native thread

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

На самом деле это очень просто воспроизвести на windows на 32-битной машине, так как там процессу выделяется не больше 2Гб.

Допустим у вас есть приложение с большим количеством одновременно работающих пользователей, которое запускается с параметрами -Xmx1024M -XX:MaxPermSize=256M -Xss512K. Если всего процессу доступно 2G, то остается свободным еще коло 768M. Именно в данном остатке памяти и создаются стеки потоков. Таким образом, примерно вы можете создать не больше 768*(1024/512)=1536 (у меня при таких параметрах получилось создать 1316) нитей (см. рисунок в начале статьи), после чего вы получите OutOfMemoryError. Если вы увеличиваете -Xmx, то количество потоков, которые вы можете создать соответственно уменьшается. Вариант с уменьшением -Xss, для возможности создания большего количества потоков, не всегда выход, так как, возможно, у вас существуют в системе потоки требующие довольно больших стеков. Например, поток инициализации или какие-нибудь фоновые задачи. Но все же выход есть. Оказывается при программном создании потока, можно указать размер стека: Thread(ThreadGroup group, Runnable target, String name,long stackSize). Таким образом вы можете выставить -Xss довольно маленьким, а действия требующие больших стеков, выполнять в отдельных потоках, созданных с помощью упомянутого выше конструктора.

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

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

Источник

Оцените статью