- 浏览: 157115 次
- 来自: ...
文章分类
- 全部博客 (110)
- 网络 (3)
- window (1)
- eclipse (2)
- mysql (3)
- java (43)
- spring (2)
- memcahe (4)
- kestrel (1)
- linux (19)
- maven (1)
- 总结 (1)
- ActiveMQ (1)
- 线程 (6)
- nio (7)
- java pool (1)
- IO (1)
- 架构 (1)
- Hadoop (1)
- Storm (1)
- zookeeper (3)
- 工作进程 (1)
- epoll (3)
- nginx (4)
- uml (1)
- 分布式 (1)
- RMI (4)
- redis (1)
- shell (4)
- 黄金文档 (1)
- office (2)
- linux_setup (1)
- visio (1)
- BIOS (1)
- 回调 (1)
- jvm (1)
- resin (1)
- ssd (0)
- xmpp (1)
最新评论
-
qxjandyc:
hjjjjjjjjjjjjjjjjjjjjjj
(emoji表情) unicode5与unicode6互换 -
一个人旅行:
写的不错哦
(emoji表情) unicode5与unicode6互换
查看最大线程数:
cat /proc/sys/kernel/threads-max
1、
每进程可用线程数 = VIRT上限/stack size
其中 VIRT 上限: 32位x86 = 3G 64位x64=64G
statck size 默认是 10240 因此在默认情况下
32位系统上单进程最多可以创建300个线程,
64系统在内存充足的情况下最多可以创建 6400 个线程。
2、
Linux查看进程中运行线程数
ps -Tfp PID
cat /proc/${pid}/stat | awk '{print $20}'
pstree -p $pid 后+1
3、jvm可创建最大线程数
http://hi.baidu.com/wphvseyvcbfkpxe/item/037488116cefd90a8ebde4b1
在java应用中,有时候会出现这样的错误:OutOfMemoryError: unable to create new native thread.这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。有人发现,在线程个数很多的情况下,你分配给JVM的内存越多,那么,上述错误发生的可能性就越大。
那么是什么原因造成这种问题呢?
每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。
这样结论就出来了,要想创建更多的线程,你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。
给出一个有关能够创建线程的最大个数的估算公式:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
对于jdk1.5而言,假设操作系统保留120M内存:
1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads
1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads
对于栈大小为256KB的jdk1.4而言,
1.5GB allocated to JVM: ~1520 threads
1.0GB allocated to JVM: ~3520 threads
如果我没有记错的话,在2000/XP/2003里头有一个启动选项,好像是:/PAE /3G ,可以让用户进程最大内存扩充至3G,这时操作系统只能占用最多1G的虚存。那样应该可以让JVM创建更多的线程。
cat /proc/sys/kernel/threads-max
1、
每进程可用线程数 = VIRT上限/stack size
其中 VIRT 上限: 32位x86 = 3G 64位x64=64G
statck size 默认是 10240 因此在默认情况下
32位系统上单进程最多可以创建300个线程,
64系统在内存充足的情况下最多可以创建 6400 个线程。
2、
Linux查看进程中运行线程数
ps -Tfp PID
cat /proc/${pid}/stat | awk '{print $20}'
pstree -p $pid 后+1
3、jvm可创建最大线程数
http://hi.baidu.com/wphvseyvcbfkpxe/item/037488116cefd90a8ebde4b1
在java应用中,有时候会出现这样的错误:OutOfMemoryError: unable to create new native thread.这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。有人发现,在线程个数很多的情况下,你分配给JVM的内存越多,那么,上述错误发生的可能性就越大。
那么是什么原因造成这种问题呢?
每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。
这样结论就出来了,要想创建更多的线程,你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。
给出一个有关能够创建线程的最大个数的估算公式:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
对于jdk1.5而言,假设操作系统保留120M内存:
1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads
1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads
对于栈大小为256KB的jdk1.4而言,
1.5GB allocated to JVM: ~1520 threads
1.0GB allocated to JVM: ~3520 threads
如果我没有记错的话,在2000/XP/2003里头有一个启动选项,好像是:/PAE /3G ,可以让用户进程最大内存扩充至3G,这时操作系统只能占用最多1G的虚存。那样应该可以让JVM创建更多的线程。
发表评论
-
curl命令使用
2012-10-24 15:48 1343curl -o /dev/null -s -w %{time ... -
shell 脚本文件追踪与 debug
2012-10-23 17:52 963scripts 在运行之前,最怕的就是出现语法错误的问题了!那 ... -
shell 截取字符串方法集
2012-10-23 17:46 1042截取字符串: 1.expr substr "$a& ... -
linux nmap 命令
2012-09-25 17:57 9219Nmap即Network Mapper,它是 ... -
linux source 命令
2012-09-25 17:55 1073命令用法: source FileName 作用:在当前bas ... -
Linux查看文件编码格式及文件编码转换
2012-09-13 11:38 876如果你需要在Linux 中操作windows下的文件,那么你可 ... -
线程123总结
2012-09-02 22:34 746线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一 ... -
rsync 同步
2012-08-28 09:51 552一、被同步机 1、/usr/bin/rsync --daemo ... -
linux的hostname修改详解
2012-08-27 21:57 549http://soft.chinabyte.com/os/28 ... -
学习命令
2012-08-17 18:23 666strace dmsg ldd -
Linux free命令详解(转)
2012-08-17 18:12 934http://www.cnblogs.com/ggjuchen ... -
shell 统计 uv 量
2012-08-17 16:33 647cat 201233.log | grep "201 ... -
文本读取每行
2012-08-08 17:43 7231、 for row in `echo ${SERVER_PI ... -
vi 命令详解
2012-08-08 14:02 7881、vi的基本概念 ... -
Thread.interrupt()方法很详细的介绍
2012-08-02 14:46 853http://blog.csdn.net/yonghuming ... -
查看端口连接数
2012-07-11 16:43 752netstat -an |grep 22135 |grep E ... -
Linux下查看CPU真实核数
2012-07-09 17:29 866Linux下查看CPU真实核数 cat /proc/cpu ... -
理解Linux Load Average
2012-07-09 17:27 1099http://hi.baidu.com/musk1984/it ... -
spring线程池配置
2012-07-08 21:13 814http://superivan.iteye.com/blog ... -
Java线程:大总结
2012-07-07 17:23 530http://lavasoft.blog.51cto.com/ ...
相关推荐
Visual C++源代码 81 如何获取系统指定进程线程信息Visual C++源代码 81 如何获取系统指定进程线程信息Visual C++源代码 81 如何获取系统指定进程线程信息Visual C++源代码 81 如何获取系统指定进程线程信息Visual ...
linux进程的最大线程数 及最大进程数.zip
多线程在当今软件开发中应用非常广泛,在实际开发过程中,发现很多不正确使用线程的现象,其中一点就是线程使用过于随意,导致进程中的线程数量过多,从而引起内存占用、性能浪费等问题。 本文将分别研究32位进程和...
程序主要功能是:输入进程pid,对该pid进程进行所占物理内存、句柄数、线程数、GDI数等增长情况进行监控,并将数据保存txt文件,便于事后分析,主要应用与开发过程中监控内存泄漏等
看过的最清楚的进程线程,进程和线程对比 根本不用大头书就可以理解透彻。
进程线程 进程线程
通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。
易语言获取系统进程线程信息源码,获取系统进程线程信息,getPidThreadInfo,getThreadStartAddress,取线程入口,提升进程权限,转换十到十六,CreateToolhelp32Snapshot,Thread32First,Thread32Next,CloseHandle,...
易语言源码易语言获取系统进程线程信息源码.rar 易语言源码易语言获取系统进程线程信息源码.rar 易语言源码易语言获取系统进程线程信息源码.rar 易语言源码易语言获取系统进程线程信息源码.rar 易语言源码易语言...
进程线程通信,线程同步,异步,进程通信经典
进程、线程和优先级 工作线程和用户界面线程 线程同步 线程通讯
Windows下查看进程中的线程
该文档为进程与线程的生动详细地理解,个人认为讲的非常好。形象生动。
进程线程补充
易语言取窗口进程线程句柄等源码。@易语言源码分享站。
详细讲解进程和线程之间的区别,方便初学者能更深透的理解
服务器客户端-socket(进程线程),包括套接字,多线程,多进程,单进程,并发,互斥锁,tcp/ip,udp等
监控系统所有进程的CPU使用情况 显示CPU占用大于0的进程,定时刷新 可以查看当前系统运行的各进程cpu占用率 在CSDN上找到两个都不太好用,自己写了一个VS...用途:查看自己写的程序那个线程运行时间最多,耗资源等。
进程与线程,本质意义上说, 是操作...同时由于 Java 的封装也隐藏了底层的一些概念和可操作性,本文还对 Java 进程线程和本地进程线程做了一些简单的比较,列出了使用 Java 进程、线程的一些限制和需要注意的问题。
线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的...