JVM手动分配内存(转载)

原文内容很详细,不利于快速浏览,所以只保留了重点

原文地址 http://blog.csdn.net/mr__fang/article/details/47723767

内存检测工具jvisualVM参考

https://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

下面这篇更详细些

http://www.cnblogs.com/feng-gamer/p/6039380.html

内存设置的主要参数:

Trace跟踪参数(打印日志):

1、打印GC的简要信息

-verbose:gc
-XX:+printGC

2、打印GC的详细信息:

-XX:+PrintGCDetails

3打印CG发生的时间戳

-XX:+PrintGCTimeStamps

4指定GC log的位置:

-Xloggc:log/gc.log

5每一次GC前和GC后,都打印堆信息。

-XX:+PrintHeapAtGC

6监控类的加载。

-XX:+TraceClassLoading

7按下Ctrl+Break后,打印类的信息(mac上没法用)

-XX:+PrintClassHistogram

二、堆的分配参数:

1.-Xmx –Xms:指定最大堆和最小堆

2.

  • -Xmn

    设置新生代大小

  • -XX:NewRatio

    新生代(eden+2*s)和老年代(不包含永久区)的比值

        例如:4,表示新生代:老年代=1:4,即新生代占整个堆的1/5

  • -XX:SurvivorRatio(幸存代)
    -XX:SurvivorRatio=8

    设置两个Survivor区和eden的比值

        例如:8,表示两个Survivor:eden=2:8,即一个Survivor占年轻代的1/10

3、-XX:+HeapDumpOnOutOfMemoryError、-XX:+HeapDumpPath

  • -XX:+HeapDumpOnOutOfMemoryError

    OOM时导出堆到文件

      根据这个文件,我们可以看到系统dump时发生了什么。

  • -XX:+HeapDumpPath(这个可以不设置,默认到处到当前项目根目录下,设置后会因为文件名相同无法导出第二次)

    导出OOM的路径

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump

4、-XX:OnOutOfMemoryError:

  • -XX:OnOutOfMemoryError

    在OOM时,执行一个脚本。

      可以在OOM时,发送邮件,甚至是重启程序。

-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p //p代表的是当前进程的pid 

5.

堆的分配参数总结:

  • 根据实际事情调整新生代和幸存代的大小
  • 官方推荐新生代占堆的3/8
  • 幸存代占新生代的1/10
  • 在OOM时,记得Dump出堆,确保可以排查现场问题

6、永久区(也就是常说的methodSpace)分配参数:

  • -XX:PermSize  -XX:MaxPermSize
  • 类多了就炸了

    设置永久区的初始空间和最大空间。也就是说,jvm启动时,永久区一开始就占用了PermSize大小的空间,如果空间还不够,可以继续扩展,但是不能超过MaxPermSize,否则会OOM。

    他们表示,一个系统可以容纳多少个类型

三、栈的分配参数:

1、Xss:

-Xss256K 

设置栈空间的大小。通常只有几百K

  决定了函数调用的深度

  每个线程都有独立的栈空间

  局部变量、参数 分配在栈上

注:栈空间是每个线程私有的区域。栈里面的主要内容是栈帧,而栈帧存放的是局部变量表,局部变量表的内容是:局部变量、参数。

用没有出口的递归调用可导致栈溢出

原文地址:https://www.cnblogs.com/lakeslove/p/7273145.html