java虽然是自动回收内存,但是应用程序,尤其服务器程序最好根据业务情况指明内存分配限制。否则可能导致应用程序宕掉。
举例说明含义:-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:PermSize=64MB 最小尺寸,初始分配
-XX:MaxPermSize=256MB 最大允许分配尺寸,按需分配
过小会导致:java.lang.OutOfMemoryError: PermGen space
MaxPermSize缺省值和-server -client选项相关。
-server选项下默认MaxPermSize为64m
-client选项下默认MaxPermSize为32m
相比Perm Size (permanent generation size)和 Heap Size,OutOfMemoryError 要更常见一些。一般当你遇到OutOfMemoryError 问题时,很多人会告诉你用下面种方法来解决问题:
•添加/调整启动参数-Xms 和 -Xmx,用以增大Heap Size
•以server 方式启动JVM,用以提高JVM”运行期”的执行效率
•检查程序,看是否有不合理的new 操作导致大量不必要的内存消耗
上面两种方法确能解决许多普通问题,但有时即使你设置了很大的Heap Size(比如-Xms128m -Xmx1024m),OutOfMemoryError 仍可能会出现,这时Perm Size 就可能与你有关了。
参见:
•http://lists.canoo.com/pipermail/webtest/2004q3/002460.html
•http://www.raibledesigns.com/page/rd?anchor=how_do_you_determine_a
•http://forum.java.sun.com/thread.jspa?threadID=775925
Perm Size 是部分与-Xms/mx 所指定的heap size无关的内存空间(default: 32M for client, 64M for server),所以即使你设置了再大的ms/mx 值,也仍然存在OutOfMemoryError 隐患。Perm Size 中存放了class 的metadata 等(google for more information)信息,如果你的应用中采用了 Spring、Hibernate 或 Tapestry 等基于 reflection 和 proxying 的框架时,你就很有可能会遇到OutOfMemoryError。
如果是这种情况那就考虑在启动时加入如下参数吧:-XX:PermSize=128m
至于如何选择最合适的PermSize值,可以参考
http://www.raibledesigns.com/page/rd?anchor=how_do_you_determine_a
里面提到了分析最优PermSize 值的几种方法。
注意:并非所有JVM vendor 开发的JVM 都支持/存在PermSize 问题。
另,OutOfMemoryError 的多与JVM 的 GC 有关,选择合适的GC 策略,合理设置启动选项会有很大帮助,参见:http://geniil.spaces.live.com/blog/cns!81B15F02616BA25C!204.entry
另在工作环境里可以使用jrocket
相关推荐
JVM 在启动的时候会自动设置 Heap size 的值,其初始空间(即-Xms)是物理内存的 1/64,最大空间(-Xmx)是物理内存的 1/4。 解决方法: 1. 手动设置 Heap size。可以利用 JVM 提供的-Xmn -Xms -Xmx 等选项可进行...
Minor 收集主要是对 Young Generation 中的对象进行垃圾回收,而 Major 收集是针对整个 Heap size 的垃圾回收。 堆和非堆内存 JVM 主要管理两种类型的内存:堆和非堆。堆是 Java 代码可及的内存,是留给开发人员...
- 考虑到现代JVM版本已不再使用 PermGen 空间,因此`-XX:MaxPermSize`在较新的Java版本中可能不适用,取而代之的是`-XX:MetaspaceSize`和`-XX:MaxMetaspaceSize`。 通过对这些知识点的理解,开发者可以更好地调整...
-Xms(Initial Heap Size) - **定义**:设置JVM启动时初始分配给堆内存的空间大小。 - **作用**:减少JVM启动时所需的内存分配时间。当-Xms与-Xmx相同时,JVM在启动时会分配一个固定大小的堆内存,从而避免了动态...
- `-Xmx` 和 `-Xms` 用于设定JVM的最大堆(`Max Heap Size`)和最小堆(`Initial Heap Size`)。保持它们相等可以避免内存频繁调整导致的性能波动。 - `-Xmn` 设定年轻代(`Young Generation`)的大小,通常与应用中创建...
- **初始堆大小(Initial Heap Size)**:通过`-Xms`参数设置,默认值为物理内存的1/64。 - **最大堆大小(Maximum Heap Size)**:通过`-Xmx`参数设置,默认值为物理内存的1/4。 - **年轻代大小(Young ...
Java Heap Space是指JVM堆的设置,是指Java程序运行过程中JVM可以调配使用的内存空间的设置。OutOfMemoryError: Java heap space异常是由于Heap size不足引起的。解决方法是手动设置Heap size。在Tomcat以bat方式...
在Java的早期版本中,JVM内存被划分为几个区域,包括堆(Heap)、栈(Stack)、方法区(Method Area)以及程序计数器(PC Register)。在描述中提到的`Xms`、`Xmx`、`PermSize`和`MaxPermSize`是与JVM内存管理相关的...
首先,方法区是一种逻辑上的堆内存部分,但在HotSpot JVM中被称为Non-Heap,与Java堆区分离。它与Java堆一样,是线程共享的内存区域,主要负责存储已经被JVM加载的类型信息,包括类、接口、枚举、注解等。这些信息...
调优时需关注-Xms、-Xmx设置堆内存大小,-XX:PermSize和-XX:MaxPermSize设定方法区大小,以及-XX:StackSize调整栈内存大小,确保避免内存溢出或不足。 2. **垃圾收集器选择**:JVM提供了多种垃圾收集器,如Serial、...
JVM内存分为几个主要区域:堆内存(Heap)、方法区(Method Area)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。其中,堆内存用于存储对象实例,方法区...
4. 方法区(Method Area):用于存储已经被虚拟机加载的类信息,常量("zdy","123"等),静态变量(static 变量)等数据,可用以下参数调整:jdk1.7 及以前:-XX:PermSize;-XX:MaxPermSize;jdk1.8 以后:-XX:Metaspace...
JNLP中参数:initial-heap-size和max-heap-size 这可以在framework的RequestManager中生成JNLP文件时加入上述参数,但是这些值是要求根据客户机的硬件状态变化的(如客户机的内存大小等)。建议这两个参数值设为...
对于元空间,JVM会根据需要自动调整大小,但可以使用`-XX:MetaspaceSize`和`-XX:MaxMetaspaceSize`进行控制。 JVM的性能调优涉及垃圾回收算法的选择。常见的有Serial、Parallel(并行)和Concurrent(并发)算法。...
- `-XX:PermSize` 和 `-XX:MaxPermSize`(Java 8之前)或 `-XX:MetaspaceSize` 和 `-XX:MaxMetaspaceSize`(Java 8及以上)设置方法区的大小。 2. **垃圾收集器选择**: JVM提供了多种垃圾收集器,如Serial、...