茂名做网站dyiee,asp.net程序做的网站安全吗,网站导航下拉菜单代码,用手机画房子平面图ava虽然是自动回收内存#xff0c;但是应用程序#xff0c;尤其服务器程序最好根据业务情况指明内存分配限制。否则可能导致应用程序宕掉。 举例说明含义#xff1a; -Xms128m 表示JVM Heap(堆内存)最小尺寸128MB#xff0c;初始分配 -Xmx512m 表示JVM Heap(堆内存)最大允许…ava虽然是自动回收内存但是应用程序尤其服务器程序最好根据业务情况指明内存分配限制。否则可能导致应用程序宕掉。 举例说明含义 -Xms128m 表示JVM Heap(堆内存)最小尺寸128MB初始分配 -Xmx512m 表示JVM Heap(堆内存)最大允许的尺寸256MB按需分配。 说明如果-Xmx不指定或者指定偏小应用可能会导致java.lang.OutOfMemory错误此错误来自JVM不是Throwable的无法用try...catch捕捉。 PermSize和MaxPermSize指明虚拟机为java永久生成对象Permanate generation如class对象、方法对象这些可反射reflective对象分配内存限制这些内存不包括在Heap堆内存区之中。 -XX:PermSize64MB 最小尺寸初始分配 -XX:MaxPermSize256MB 最大允许分配尺寸按需分配 过小会导致java.lang.OutOfMemoryError: PermGen space MaxPermSize缺省值和-server -client选项相关。 -server选项下默认MaxPermSize为64m -client选项下默认MaxPermSize为32m 经验 1、慎用最小限制选项Xms,PermSize已节约系统资源。 近期研究对jvm的内存使用情况进行监控因此对观察虚拟机的内存使用方法做了一些收集对jvm的参数设置了解了一下 几个基本概念
PermGen 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定义YOUNGOLD段的总尺寸ms为JVM启动时YOUNGOLD的内存大小mx为最大可占用的YOUNGOLD内存大小。在用户生产环境上一般将这两个值设为相同以减少运行期间系统在内存申请上所花的开销。 NewSize/MaxNewSize定义YOUNG段的尺寸NewSize为JVM启动时YOUNG的内存大小MaxNewSize为最大可占用的YOUNG内存大小。在用户生产环境上一般将这两个值设为相同以减少运行期间系统在内存申请上所花的开销。 PermSize/MaxPermSize定义Perm段的尺寸PermSize为JVM启动时Perm的内存大小MaxPermSize为最大可占用的Perm内存大小。在用户生产环境上一般将这两个值设为相同以减少运行期间系统在内存申请上所花的开销。 SurvivorRatio设置YOUNG代中Survivor空间和Eden空间的比例
申请一块内存的过程
A. JVM会试图为相关Java对象在Eden中初始化一块内存区域 B. 当Eden空间足够时内存申请结束。否则到下一步 C. JVM试图释放在Eden中所有不活跃的对象这属于1或更高级的垃圾回收释放后若Eden空间仍然不足以放入新对象则试图将部分Eden中活跃对象放入Survivor区/OLD区 D. Survivor区被用来作为Eden及OLD的中间交换区域当OLD区空间足够时Survivor区的对象会被移到Old区否则会被保留在Survivor区 E. 当OLD区空间不够时JVM会在OLD区进行完全的垃圾收集0级 F. 完全垃圾收集后若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象导致JVM无法在Eden区为新对象创建内存区域则出现”out of memory错误”
我们的一种resin服务器的jvm参数设置
“-Xmx2000M -Xms2000M -Xmn500M -XX:PermSize250M -XX:MaxPermSize250M -Xss256K -XX:DisableExplicitGC -XX:SurvivorRatio1 -XX:UseConcMarkSweepGC -XX:UseParNewGC -XX:CMSParallelRemarkEnabled -XX:UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction0 -XX:CMSClassUnloadingEnabled -XX:LargePageSizeInBytes128M -XX:UseFastAccessorMethods -XX:UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction60 -XX:SoftRefLRUPolicyMSPerMB0 -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) Collector young generation parallel collector 2 old cms 同时不做 compact 操作。 优点pause time会降低, pause敏感但CPU有空闲的场景需要建议使用策略4. 缺点cpu占用过多cpu密集型服务器不适合。另外碎片太多每个object的存储都要通过链表连续跳n个地方空间浪费问题也会增大。 内存监控的方法
1. jmap -heap pid 查看java 堆heap使用情况 using thread-local object allocation. Parallel GC with 4 thread(s) //GC 方式 Heap Configuration: //堆内存初始化配置 MinHeapFreeRatio40 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40) MaxHeapFreeRatio70 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70) MaxHeapSize512.0MB //对应jvm启动参数-XX:MaxHeapSize设置JVM堆的最大大小 NewSize 1.0MB //对应jvm启动参数-XX:NewSize设置JVM堆的‘新生代’的默认大小 MaxNewSize 4095MB //对应jvm启动参数-XX:MaxNewSize设置JVM堆的‘新生代’的最大大小 OldSize 4.0MB //对应jvm启动参数-XX:OldSizevalue:设置JVM堆的‘老生代’的大小 NewRatio 8 //对应jvm启动参数-XX:NewRatio:‘新生代’和‘老生代’的大小比率 SurvivorRatio 8 //对应jvm启动参数-XX:SurvivorRatio设置年轻代中Eden区与Survivor区的大小比值 PermSize 16.0MB //对应jvm启动参数-XX:PermSizevalue:设置JVM堆的‘永生代’的初始大小 MaxPermSize64.0MB //对应jvm启动参数-XX:MaxPermSizevalue:设置JVM堆的‘永生代’的最大大小 Heap Usage: //堆内存分步 PS Young Generation Eden Space: //Eden区内存分布 capacity 20381696 (19.4375MB) //Eden区总容量 used 20370032 (19.426376342773438MB) //Eden区已使用 free 11664 (0.0111236572265625MB) //Eden区剩余容量 99.94277218147106% used //Eden区使用比率 From Space: //其中一个Survivor区的内存分布 capacity 8519680 (8.125MB) used 32768 (0.03125MB) free 8486912 (8.09375MB) 0.38461538461538464% used To Space: //另一个Survivor区的内存分布 capacity 9306112 (8.875MB) used 0 (0.0MB) free 9306112 (8.875MB) 0.0% used PS Old Generation //当前的Old区内存分布 capacity 366280704 (349.3125MB) used 322179848 (307.25464630126953MB) free 44100856 (42.05785369873047MB) 87.95982001825573% used PS Perm Generation //当前的 “永生代” 内存分布 capacity 32243712 (30.75MB) used 28918584 (27.57891082763672MB) free 3325128 (3.1710891723632812MB) 89.68751488662348% used