`
城的灯
  • 浏览: 152199 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JVM最大Thread数量

    博客分类:
  • 2013
 
阅读更多
原文地址:http://www.yangguo.info/2013/6/17/22.html

最近研发推送方案,需要大量线程来模拟手机客户端。在模拟手机客户端的时候,单个JVM线程数量始终卡在一万多一点,然后就报如下的错误:”java.lang.OutOfMemoryError: unable to create new native thread“。我在网上找了很多资料,都是分析32位的,都是准备模拟几千个或者几万个水平。因为我是使用64位的linux,并且要模拟50万,发现很多都不是很详细。对于这个OOM,根本无需多言,网上一堆关于JVM线程数的计算公式,此处我不妨再次引用一次:
(MaxProcessMemory - JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads 。MaxProcessMemory:进程最大的寻址空间,关于不同系统的进程默认的最大寻址空间,可以参考如下表格:
Operating SystemMaximum Address Space Per Process
Redhat Linux 32 bit2 GB
Redhat Linux 64 bit3 GB
Windows 98/2000/NT/Me/XP2 GB
Solaris x86 (32 bit)4 GB
Solaris 32 bit4 GB
Solaris 64 bitTerabytes

JVMMemory: Heap + PermGen
ReservedOSMemory:Native heap,JNI
通过上面的说明大概就能估算出线程数量:
(MaxProcessMemory<固定值> – Xms<初始化值,最小值> – XX:PermSize<初始化值,最小值> – 100m<估算值>) / Xss = Number of threads<最大值>
公式已经放在上面了,这个时候各个值的设置地方如下:

Java虚拟机本身:
-Xms,-Xmx,-Xss

系统限制:
/proc/sys/kernel/pid_max
开始我也觉得奇怪,为什么需要修改pid呢?pid不是进程id嘛,我只是创建线程,并不创建进程,pid的大小跟我好像没有关系。查阅资料才发现,同一个进程的多个线程的pid其实是不同的。

/proc/sys/vm/max_map_count
max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上线但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。如果你的操作系统在NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。具体的可以查看redhat的这篇文章:http://www.redhat.com/magazine/001nov04/features/vm/,中文的话是这篇:http://www.oschina.net/translate/understanding-virtual-memory?print

还有注意ulimit -a中参数的大小
当然有人说下面这个两个需要修改,但是我测试下来,好像不用修改也行,反正我没有修改。
/proc/sys/kernel/thread-max
/etc/security/limits.d/90-nproc.conf

注意如果使用
#sysctl -w vm.max_map_count=200000
#sysctl -p
来修改,重启后值会改变,如果想永久改变需要如下操作:
vm.max_map_count=200000直接写到/etc/sysctl.conf中,然后执行sysctl -p

对于我的应用,此处还要设置一个socket端口的取值范围
net.ipv4.ip_local_port_range = 1024 65535
当然对于非socket应用是不需要设置该值的

至于上面各个参数的设置,可以去查看linux方面的一些资料。至于值到底多大,得根据你机器的性能来确定。
分享到:
评论

相关推荐

    jvm支持最大线程数简单测试

    jvm支持的最大线程数是受多种因素影响的,包括java堆内存大小、Thread的Stack内存大小、系统最大可创建的线程数量等。通过调整这些参数,可以影响jvm支持的最大线程数。 2. 影响jvm支持最大线程数的因素 影响jvm...

    JVM技术培训讲座

    - **ThreadStack溢出**:如果线程创建过多,超出操作系统允许的最大数量,则可能导致Thread Stack溢出。 - **方法区溢出**:当方法区无法容纳更多的类信息或其他元数据时,会发生方法区溢出。 - **本机直接内存溢出*...

    JVM内存参数调优

    3. **线程栈(Thread Stack)**:用于存储线程的局部变量、栈帧等。 #### 堆内存配置详解 堆内存是JVM管理的主要区域之一,也是最常发生内存溢出的地方。合理的堆内存配置可以显著提升应用性能。以下是一些重要的...

    JVM调优总结 Xms -Xmx -Xmn -Xss

    - **作用**:限制JVM能够使用的最大内存空间,防止程序占用过多资源导致系统不稳定或崩溃。 - **示例**:`java -Xmx3550m ...` #### 3. -Xmn(Young Generation Size) - **定义**:设置年轻代(Young Generation...

    JVM堆内存分析工具,OOM排查工具。包括ha和mat两种

    3. **分析内存使用**:查看对象数量、大小分布,找出占内存最大的类,分析其生命周期和引用关系。 4. **查找内存泄漏**:利用MAT的Dominator Tree和Leak Suspects报告,定位可能的内存泄漏源。 5. **优化调整**:...

    JVM内存溢出

    3. **OutOfMemoryError: unable to create new native thread**:这是线程栈溢出,当操作系统无法为新的Java线程分配足够的内存时抛出。这可能是因为操作系统资源限制或者JVM线程栈设置过小。可以通过`-Xss`参数来...

    JVM 面试题总结.md

    2. **快速分配**:对于频繁创建和销毁的小对象,JVM可能会采用快速分配的方式,比如通过TLAB(Thread Local Allocation Buffer,线程局部分配缓冲区)来进行快速分配。 ### 请你说一下对象的内存布局? 对象的内存...

    多线程、JVM复习&面试&强化训练100题

    线程池是JDK提供的一个用于管理线程生命周期的框架,它能够有效控制线程数量,减少资源消耗。Executor框架包括了Executor、ExecutorService、CompletionService、Future、Callable等接口和类。Executors则是Executor...

    Java面试JVM+多线程重点突破.zip

    5. **多线程**:Java提供多种创建线程的方式,如继承Thread类、实现Runnable接口或使用ExecutorService。理解线程状态(新建、就绪、运行、阻塞、死亡)及其转换。 6. **线程同步**:synchronized关键字、volatile...

    A-JUC-JVM-Java并发知识..pdf

    ### JUC并发编程 #### JUC多线程及高并发 Java并发编程包(java.util....例如,可以限制搜索范围、根据stars或fork数量进行搜索,使用awesome来加强搜索结果的相关性,以及使用高亮显示代码和项目内搜索功能等。

    java_jvm_参数_-Xms_-Xmx_-Xmn_-Xss_调优总结.pdf

    - **影响**:该参数控制着JVM可以使用的最大堆内存。设置过大的`-Xmx`可能会导致内存不足或者操作系统无法满足需求。合理设置该参数可以避免因内存溢出而导致的应用崩溃。 - **示例**:`-Xmx3550m` 表示设置最大堆...

    Tomcat内存溢出的三种情况及解决办法分析

    内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程...

    tomcat优化

    - `-Xmx`:设置JVM最大堆内存大小。如`-Xmx128m`,意味着JVM的最大堆内存限制为128MB。 - `-Xmn`:虽然示例中未提及,但这个参数用于指定年轻代(Young Generation)的大小。年轻代是对象最初分配的区域,频繁的垃圾...

    高手总结的9种OOM常见原因及解决方案.docx

    Unable to create new native thread错误发生在每个Java线程都需要占用一定的内存空间,当JVM向底层操作系统请求创建一个新的native线程时,如果没有足够的资源分配就会报此类错误。常见的原因包括: * 线程数超过...

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    - **Java并发演进历史**:从Java 1.0的Thread类到Java 5引入的并发包`java.util.concurrent`,再到Java 7和8的改进,Java并发API不断发展,提供了更多高效、易用的并发工具。 - **Java并发模型**:Java并发模型...

    OutOfMemoryError_8种典型案例分享

    尝试创建一个超过JVM允许的最大数组大小的数组时,就会抛出Requested array size exceeds VM limit错误。解决该问题的方法是增加JVM参数-XX:MaxPermSize的值或调整数组大小限制。 8. 处理器牺牲子进程(Kill ...

    java_thread_cn.rar_Java 线程池_java thread books_java线程_线程池_线程池调度

    在Java中,默认采用的是抢占式调度,即线程的执行优先级由JVM决定,高优先级的线程可能会中断低优先级线程的执行。然而,开发者可以通过设置线程的优先级来影响调度,但需要注意,过度依赖线程优先级可能会导致调度...

    Java线程的简单例子

    线程池可以定制核心线程数、最大线程数、线程存活时间和工作队列大小等参数,以适应不同场景的需求。 最后,死锁是多线程编程中的常见问题,两个或更多线程相互等待对方释放资源导致无法继续执行。为了避免死锁,...

    tomcat内存溢出总结(2013年)

    解决方法可能涉及调整JVM的线程栈大小(例如使用`-Xss`参数),以及操作系统级别的线程数量限制。此外,减少并发线程数或优化线程使用也可能有助于避免此类问题。 除了上述参数调整外,还需要注意以下几点: - 定期...

Global site tag (gtag.js) - Google Analytics