java maxpermsizee应该设置多大 storm

博客访问: 238620
博文数量: 38
博客积分: 169
博客等级: 入伍新兵
技术积分: 1049
注册时间:
认证徽章:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Java
java &-Xms -Xmx -XX:PermSize -XX:MaxPermSize
& & &&在做java开发时尤其是大型软件开发时经常会遇到内存溢出的问题,比如说OutOfMemoryError等。这是个让开发人员很痛苦、也很纠结的问题,因为我们有时不知道什么样的操作导致了这种问题的发生。所以我们不得不通过不断的优化自己的代码结构,重构了一次又一次。虽然说不断的重构自己的代码对公对私都是一件非常好的事,但是有时我们会发现有些时候不单单是通过重构自身的代码就能够解决这样的问题,因为也可能是由于我们对java虚拟机运行时的内存分配的不得当导致了内存溢出现象的不断发生。为了解决这一问题,java开发团队提供了一个用户自定义的方式按需配置java虚拟机运行时的所需的内存——通过参数配置的形式实现参数分配自定义化。
& & 在解析如何通过参数来配置JVM运行时内存分配之前,要说明一下JVM运行时内存的格局。
&&&&&JVM按照其存储数据的内容将所需内存分配为堆区与非堆区两个部分:所谓堆区即为通过new的方式创建的对象(类实例)所占用的内存空间;非堆区即为代码、常量、外部访问(如文件访问流所占资源)等。然而虽然java的垃圾回收机制虽然能够很好的解决内存浪费的问题,但是这种机制也仅仅的是回收堆区的资源,而对于非堆区的资源就束手无策了,针对这样的资源回收只能凭借开发人员自身的约束来解决。就算是这样(堆区有java回收机制、非堆区开发人员能够很好的解决),当运行时所需内存瞬间激增的时候JVM无奈的也要中止程序的运行。所以本文讲述的是如何解决后者的问题。
& & &好了,说了这么多是时候讲一下配置JVM内存的几种参数及其如何使用了。
& & &&首先,常见参数种类(配置内存):(-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn)、(-XX:PermSize、-XX:MaxPermSize)。可以从列举的方式上看出我的用意,参数的配置是分组的,前者是用来配置堆区的,后者是用来配置非堆区的。
& & &第一组配置参数:-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn
&&&&& & 1、-Xms :表示java虚拟机堆区内存初始内存分配的大小,通常为操作系统可用内存的1/64大小即可,但仍需按照实际情况进行分配。有可能真的按照这样的一个规则分配时,设计出的软件还没有能够运行得起来就挂了。
&&&&& & 2、-Xmx: 表示java虚拟机堆区内存可被分配的最大上限,通常为操作系统可用内存的1/4大小。但是开发过程中,通常会将 -Xms 与 -Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。
&&&&&&&&一般来讲对于堆区的内存分配只需要对上述两个参数进行合理配置即可,但是如果想要进行更加精细的分配还可以对堆区内存进一步的细化,那就要用到下面的三个参数了-XX:newSize、-XX:MaxnewSize、-Xmn。当然这源于对堆区的进一步细化分:新生代、中生代、老生代。java中每新new一个对象所占用的内存空间就是新生代的空间,当java垃圾回收机制对堆区进行资源回收后,那些新生代中没有被回收的资源将被转移到中生代,中生代的被转移到老生代。而接下来要讲述的三个参数是用来控制新生代内存大小的。
&&&&& & 1、-XX:newSize:表示新生代初始内存的大小,应该小于 -Xms的值;
&&&&& & 2、-XX:MaxnewSize:表示新生代可被分配的内存的最大上限;当然这个值应该小于 -Xmx的值;
&&&&& & 3、-Xmn:至于这个参数则是对&-XX:newSize、-XX:MaxnewSize两个参数的同时配置,也就是说如果通过-Xmn来配置新生代的内存大小,那么-XX:newSize =&-XX:MaxnewSize =&-Xmn,虽然会很方便,但需要注意的是这个参数是在JDK1.4版本以后才使用的。
&&&&& & 上面所述即为java虚拟机对外提供的可配置堆区的参数,接下来讲述java虚拟机对非堆区内存配置的两个参数:
&&&&& & 1、-XX:PermSize:表示非堆区初始内存分配大小,其缩写为permanent size(持久化内存)
&&&&& & 2、-XX:MaxPermSize:表示对非堆区分配的内存的最大上限。
&&&&& & 这里面非常要注意的一点是:在配置之前一定要慎重的考虑一下自身软件所需要的非堆区内存大小,因为此处内存是不会被java垃圾回收机制进行处理的地方。并且更加要注意的是 最大堆内存与最大非堆内存的和绝对不能够超出操作系统的可用内存。
&&&&& & 致浏览者:
&&&&&&&&& & 鄙人殷切的希望大家再浏览博文时,能够留下宝贵的言论。这里我并不是要提高自身的关注度,我希望能够实现我写博客的目的,因为这里是一个交流的平台,而不是一个教室,因为我所描述的内容不 & & &&一定全是对的,所以希望大家在浏览任何一篇文章(不单单是鄙人的博文)时,能够多多的发表宝贵意见,在此先谢过了!
阅读(29157) | 评论(4) | 转发(2) |
相关热门文章
给主人留下些什么吧!~~
还是不太理解堆与非堆的具体差别。
“堆区有java回收机制、非堆区开发人员能够很好的解决。”“所以本文讲述的是如何解决后者的问题。”这个后者指的是解决非堆问题,还是让开发人员来解决内存?有点不太理解。
:写的很好,正为weblogic内存烦恼...
如果有什么高见可留言,我会非常感谢的!在学习的过程中总是希望有人能够和我一起分享! |
写的很好,正为weblogic内存烦恼...
请登录后评论。【转】&JVM虚拟机选项:Xms&Xmx&PermSize&MaxPermSize区别
java虽然是自动回收内存,但是应用程序,尤其服务器程序最好根据业务情况指明内存分配限制。否则可能导致应用程序宕掉。
举例说明含义:
表示JVM Heap(堆内存)最小尺寸128MB,初始分配
表示JVM Heap(堆内存)最大允许的尺寸256MB,按需分配。
说明:如果-Xmx不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM不是Throwable的,无法用try...catch捕捉。
PermSize和MaxPermSize指明虚拟机为java永久生成对象(Permanate
generation)如,class对象、方法对象这些可反射(reflective)对象分配内存限制,这些内存不包括在Heap(堆内存)区之中。
-XX:PermSize=64MB 最小尺寸,初始分配
-XX:MaxPermSize=256MB 最大允许分配尺寸,按需分配
过小会导致:java.lang.OutOfMemoryError: PermGen space
MaxPermSize缺省值和-server -client选项相关。
-server选项下默认MaxPermSize为64m
-client选项下默认MaxPermSize为32m
1、慎用最小限制选项Xms,PermSize已节约系统资源。
=========================================================
近期研究对jvm的内存使用情况进行监控,因此对观察虚拟机的内存使用方法做了一些收集,对jvm的参数设置了解了一下:
几个基本概念:
space:全称是Permanent Generation
space,即永久代。就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域,GC(Garbage
Collection)应该不会对PermGen
space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
Heap space:存放Instance。Java
Heap分为3个区,Young即新生代,Old即老生代和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象。
几个参数设置的意义:
xms/xmx:定义YOUNG+OLD段的总尺寸,ms为JVM启动时YOUNG+OLD的内存大小;mx为最大可占用的YOUNG+OLD内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
NewSize/MaxNewSize:定义YOUNG段的尺寸,NewSize为JVM启动时YOUNG的内存大小;MaxNewSize为最大可占用的YOUNG内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
PermSize/MaxPermSize:定义Perm段的尺寸,PermSize为JVM启动时Perm的内存大小;MaxPermSize为最大可占用的Perm内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。
SurvivorRatio:设置YOUNG代中Survivor空间和Eden空间的比例
申请一块内存的过程:
JVM会试图为相关Java对象在Eden中初始化一块内存区域
B. 当Eden空间足够时,内存申请结束。否则到下一步
JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收);释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区/OLD区
Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区
E. 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级)
完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out
of memory错误”
我们的一种resin服务器的jvm参数设置:
“-Xmx2000M
-Xms2000M -Xmn500M -XX:PermSize=250M -XX:MaxPermSize=250M -Xss256K
-XX:+DisableExplicitGC -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC
-XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M
-XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=60 -XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC -Xloggc:log/gc.log”
&是一种典型的响应时间优先型的配置。
Java中有四种不同的回收算法,对应的启动参数为
&XX:+UseSerialGC
&XX:+UseParallelGC
&XX:+UseParallelOldGC
&XX:+UseConcMarkSweepGC
1. Serial Collector
大部分平台或者强制 java -client 默认会使用这种。
young generation算法 = serial
old generation算法 = serial (mark-sweep-compact)
这种方法的缺点很明显,stop-the-world, 速度慢。服务器应用不推荐使用。
2. Parallel Collector
在linux x64上默认是这种,其他平台要加 java -server 参数才会默认选用这种。
young = parallel,多个thread同时copy
old = mark-sweep-compact = 1
优点:新生代回收更快。因为系统大部分时间做的gc都是新生代的,这样提高了throughput(cpu用于非gc时间)
缺点:当运行在8G/16G server上old generation live object太多时候pause time过长
3. Parallel Compact Collector
(ParallelOld)
young = parallel = 2
old = parallel,分成多个独立的单元,如果单元中live object少则回收,多则跳过
优点:old old generation上性能较 parallel 方式有提高
缺点:大部分server系统old generation内存占用会达到60%-80%, 没有那么多理想的单元live
object很少方便迅速回收,同时compact方面开销比起parallel并没明显减少。
4. Concurent Mark-Sweep(CMS)
young generation = parallel collector = 2
同时不做 compact 操作。
优点:pause time会降低, pause敏感但CPU有空闲的场景需要建议使用策略4.
缺点:cpu占用过多,cpu密集型服务器不适合。另外碎片太多,每个object的存储都要通过链表连续跳n个地方,空间浪费问题也会增大。
&内存监控的方法:
jmap -heap&pid
查看java 堆(heap)使用情况
using thread-local object allocation.
Parallel GC with 4
thread(s)&&&&&&&&&
Configuration:&&&&&&
//堆内存初始化配置
MinHeapFreeRatio=40&&&&
//对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio=70& //对应jvm启动参数
-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize=512.0MB&
//对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize& =
1.0MB&&&&&&&&&
//对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize =4095MB&&
//对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize& =
4.0MB&&&&&&&&&&&
//对应jvm启动参数-XX:OldSize=&value&:设置JVM堆的‘老生代’的大小
NewRatio& =
//对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio =
//对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
16.0MB&&&&&&
//对应jvm启动参数-XX:PermSize=&value&:设置JVM堆的‘永生代’的初始大小
MaxPermSize=64.0MB&
//对应jvm启动参数-XX:MaxPermSize=&value&:设置JVM堆的‘永生代’的最大大小
Usage:&&&&&&&&&&&&&&
//堆内存分步
PS Young Generation
Space:&&&&&&&&&
//Eden区内存分布
&&&&&&&&&&&
capacity = .4375MB)& //Eden区总容量
&&&&&&&&&&&
= .438MB)&
//Eden区已使用
&&&&&&&&&&&
= 15MB)& //Eden区剩余容量
&&&&&&&&&&&
99.06% used& //Eden区使用比率
Space:&&&&&&&
//其中一个Survivor区的内存分布
&&&&&&&&&&&&
capacity = .125MB)
&&&&&&&&&&&&
&&&&&&&&&&&&
= .09375MB)
&&&&&&&&&&&&
0.38464% used
Space:&&&&&&&&&&&
//另一个Survivor区的内存分布
&&&&&&&&&&&
capacity = .875MB)
&&&&&&&&&&&
= 0 (0.0MB)
&&&&&&&&&&&
&&&&&&&&&&&
PS Old Generation& //当前的Old区内存分布
&&&&&&&&&&&
capacity =
(349.3125MB)
&&&&&&&&&&&
(307.53MB)
&&&&&&&&&&&
&&&&&&&&&&&
87.73% used
PS Perm Generation& //当前的 “永生代” 内存分布
&&&&&&&&&&&
capacity = .75MB)
&&&&&&&&&&&
&&&&&&&&&&&
= .2812MB)
&&&&&&&&&&&
89.48% used
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。phpstorm 安装配置THE jvm could not be started.The maximum heap size (-Xmx) might be too large or an antivirus or firewall tool could block the execution. - 推酷
phpstorm 安装配置THE jvm could not be started.The maximum heap size (-Xmx) might be too large or an antivirus or firewall tool could block the execution.
家的本子跑的好卡,好久没重装系统了,这不立马去重新了个xp系统,感觉还不错。
可是软件没有了,得一个个安装了。
升级到5了,在公司里一直用4来着,那下载吧。不一会就下载好了,可是安装好了,一打开就出现 提示框 当的下。
显示 THE jvm could not be started.The maximum heap size (-Xmx) might be too large or an antivirus or firewall tool could block the execution.
看网上介绍说这是
找到 安装目录/bin/PhpStorm.exe.vmoptions 文件,用文字编辑器打开
-XX:MaxPermSize=250m
- 把这里的250改小一点,比如150,就可以了
-XX:ReservedCodeCacheSize=64m
果然 真的可以正常打开了。。。。。
PhpStorm注册码
下面是PhpStorm的注册码、Key,其license由用户名和License值组成。
User name:
License key:
===== LICENSE BEGIN =====
00002UsvSON704l”dILe1PVx3y4″B3
49AU6oSDJrsjE8nMOQh”8HTDJHIUUh
gd1BebYc5U”6OxDbVsALB4Eb10PW8″
===== LICENSE END =====
本文分类:
本文标签:标签:
流行热度:已超过了 10 人围观
起飞时间: 号 21:42
文章链接:/1014.html (转载时请注明本文出处及文章链接)
上一篇 &:
下一篇 &:
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致jvm中的PermSize、MaxPermSize
jvm中的PermSize、MaxPermSize
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。&由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。那么,如果是物理内存4GB,那么64分之一就是64MB,这就是PermSize默认值,也就是永生代内存初始大小;四分之一是1024MB,这就是MaxPermSize默认大小。本文出自 “” 博客,请务必保留此出处0人了这篇文章类别:┆(0)┆阅读(201)┆评论(0) ┆&┆上一篇&&下一篇&相关文章
发表评论:
TA的推荐TA的最新馆藏[转]&[转]&

我要回帖

更多关于 permsize maxpermsize 的文章

 

随机推荐