能突破限制的浏览器1024的限制么

中国领先的IT技术网站
51CTO旗下网站
巧借MyEclipse设置JVM突破内存限制
本文将介绍如何对付MyEclipse内存不足的问题,这里将涉及MyEclipse设置JVM内存的方法。希望这些对大家有作用。
作者:佚名来源:机械工业出版社| 15:31
如果没有进行设置的话,在使用MyEclipse的经常出现如下图所示内存不足的提示。
提示中说的很明白:“MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains.”意思是说当前只有小于5%的非堆内存是空闲的。所以我们只要将这个值设置大一些就可以了。
提示中给出了MyEclipse设置JVM的参数:
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
这里有几个MyEclipse设置JVM问题:
1. 各个参数的含义什么?
2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?
3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?
下面我们一一进行回答
1. 各个参数的含义什么?
参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。
堆(Heap)和非堆(Non-heap)内存
按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。
堆内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。 非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
JVM内存限制(最大值)
首先JVM内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。 2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?
通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因:
1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是,如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。
3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?
那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是因为我们没有遵守eclipse.ini文件的设置规则:
参数形如“项 值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:\Java\jre1.6.0\bin\javaw.exe参数设置虚拟机,在eclipse.ini文件中要写成这样:
-vm C:\Java\jre1.6.0\bin\javaw.exe 按照上面所说的,最后参数在eclipse.ini中可以写成这个样子:-vmargs& &-Xms128M& &-Xmx512M& &-XX:PermSize=64M& &-XX:MaxPermSize=128M&&
实际运行的结果可以通过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。
另外需要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的:-showsplash& &org.eclipse.platform& &--launcher.XXMaxPermSize& &256m& &-vmargs& &-Xms40m& &-Xmx256m&&
其中Clauncher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数,而后者是Eclipse所使用的JVM中的参数。其实二者设置一个就可以了,所以这里可以把Clauncher.XXMaxPermSize和下一行使用#注释掉。通过MyEclipse设置JVM避免内存不足的问题就介绍到这里。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条热点头条原创
24H热文一周话题本月最赞
讲师:415011人学习过
讲师:252235人学习过
讲师:12216人学习过
精选博文论坛热帖下载排行
本书既能够成为读者的理论支持,又可以作为构建可靠的、可伸缩的、可维护的并发程序的技术支持。本书并不仅仅提供并发API的清单及其机制,...
订阅51CTO邮刊博客访问: 106667
博文数量: 63
博客积分: 1410
博客等级: 上尉
技术积分: 650
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: WINDOWS
这个问题的产生是因为windows32位系统,一个进程所能使用的最在虚拟内存为2G,而一个线程的默认StackSize为1024K(1M),这样当线程数量逼近2000时,K=2G(大约),内存资源就相当于耗尽。
第一种方式:要求有windows2003SDK
Does Windows have a limit of 2000 threads per process?
Often I see people asking why they can't create more than around 2000 threads in a process. The reason is not that there is any particular limit inherent in Windows. Rather, the programmer failed to take into account the amount of address space each thread uses.
A thread consists of some memory in kernel mode (kernel stacks and object management), some memory in user mode (the thread environment block, thread-local storage, that sort of thing), plus its stack. (.)
Usually, the limiting factor is the stack size. #include &stdio.h&
#include &windows.h&
DWORD CALLBACK ThreadProc(void*)
Sleep(INFINITE);
int __cdecl main(int argc, const char* argv[])
for (i = 0; i & 100000; i++) {
HANDLE h = CreateThread(NULL, 0, ThreadProc, NULL, 0, &id);
CloseHandle(h);
printf("Created %d threads\n", i);
This program will typically print a value around 2000 for the number of threads.
Why does it give up at around 2000?
Because the default stack size assigned by the linker is 1MB, and 2000 stacks times 1MB per stack equals around 2GB, which is how much address space is available to user-mode programs.
You can try to squeeze more threads into your process by reducing your stack size, which can be done either by tweaking linker options or manually overriding the stack size passed to
as described .
HANDLE h = CreateThread(NULL, 4096, ThreadProc, NULL,
STACK_SIZE_PARAM_IS_A_RESERVATION, &id);
With this change, I was able to squeak in around 13000 threads. While that's certainly better than 2000, it's short of the naive expectation of 500,000 threads. (A thread is using 4KB of stack in 2GB address space.) But you're forgetting the other overhead. , so each thread's stack occupies 64KB of address space even if only 4KB of it is used. Plus of course you don't have free reign over all 2GB
there are system DLLs and other things occupying it.
But the real question that is raised whenever somebody asks, "What's the maximum number of threads that a process can create?" is "Why are you creating so many threads that this even becomes an issue?"
The "one thread per client" model is well-known not to scale beyond a dozen clients or so. If you're going to be handling more than that many clients simultaneously, you should move to a model where instead of dedicating a thread to a client, you instead allocate an object. (Someday I'll muse on the duality between threads and objects.) Windows provides
to help you convert from a thread-based model to a work-item-based model.
Note that fibers do not help much here, because a fiber has a stack, and it is the address space required by the stack that is the limiting factor nearly all of the time.
第二种方式:增加连接参数
/Stack:reverse[,commit]
&注意区别committed & size和reserved & size。 & & 默认情况下(除非dwCreationFlags设为STACK_SIZE_PARAM_IS_A_RESERVATION),dwStackSize这个参数用来调整一开始commit给栈的空间,即initially & committed & size。 & & & & 那么调整了committed & size后,reserved & size应该怎么有什么相应的调整呢? & & 如果dwStackSize小于默认reserve大小,则reserve & size使用默认reserve大小; & & 如果dwStackSize大于默认reserve & size,则reserve & size将会向上取整变成1MB的整数倍
如果要求默认的StackSize为64K,则将设置/Stack:65536
第三种方式:用工具editbin.exe(VC工具里)
editbin /StackSize:reverse[,commit]
阅读(4968) | 评论(0) | 转发(0) |
下一篇:没有了
相关热门文章
给主人留下些什么吧!~~
请登录后评论。原创作品180万高质量原创作品+80万可商用版权图片。每日更新 500+,低至0.18元/天。分享到:与
人分享您的设计品味您可能在找这些:059203110281501631举报成功! 3秒后自动关闭请说明举报理由源文件为合层文件素材重复/网站已存在同样内容格式不符/错误压缩包出错/解压失败文件损坏/文件空白/打不开预览图与源文件不符倒计时结束时无下载/网页丢失/404报错盗版/侵权收藏成功!
登录千图网
或该帐号还未注册,该帐号还未注册,&
添加到收藏夹
您还未创建收藏夹,点击创建增加新收藏夹吧!
您创建的收藏会显示在此处
创建到收藏夹
工作日:9:00 - 22:00
节假日:9:00 - 18:00
电话客服 :
021- 工作日:9:00 - 18:00
已连续签到天
再保持天连续签到将可获得共享VIP1天}

我要回帖

更多关于 怎么突破网速限制 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信