JVM介绍

JVM有两种类型的内存:堆和非堆。

堆(heap):堆中存放的全是对象本身。堆区被所有线程所共享。堆中包含新生代和老年代(默认内存比例为1:2)。其中新生代中又分类一个Eden区和两个survivor区(默认内存比例为8:1:1),采用复制算法。老年代采用记压缩算法。JVM堆内存有三方面限制:32位和64位操作系统的限制;系统的可用虚拟内存限制;系统物理内存的限制。32位系统(Windows系统下为限制为1.5G-2G,Linux系统 下限制为2G-3G);64位操作系统没限制。堆内存最小值(-Xms)默认为物理内存的1/64。堆内存最大值(-Xmx)默认为物理内存的1/4。默认剩余堆内存不足40%时,JVM就会将堆值改为最大堆内存(-Xmx)限制;而剩余堆内存大于70%时,JVM会减少堆值到最小堆内存(-Xms)限制。因此服务器一般设置-Xms和-Xmx为相等值,以避免在每次GC 后调整堆的大小。而新生代(-Xmn)约等于-Xmx的1/3。建议堆的最大值设置为可用内存的75%~80%左右。 

非堆:非堆区中分为栈和方法区。栈中的数据是私有的,栈中用来保存基本数据类型的对象和自定义对象的引用。方法区用来存放类结构信息、常量池、静态变量以及构造函数。JVM非堆内存(-XX:PermSize)默认是物理内存的1/64;最大非堆内存(XX:MaxPermSize)默认是物理内存的1/4。

JVM内存分配设置的常用参数 

-Xms JVM堆最小值; 
-Xmx JVM堆最大值; 
-Xmn JVM堆中新生代大小; 
-Xss 每个线程的Stack大小,不熟悉最好保留默认值; 
-XX:PermSize:永久保存区域大小; 
-XX:MaxPermSize:最大永久保存区域大小; 
-XX:NewSize:设置JVM堆的‘新生代’的默认大小; 
-XX:MaxNewSize:设置JVM堆的‘新生代’的最大大小;
-XX:MaxTenuringThreshold:垃圾回收放入老年代最大年龄;
-XX:PretenureSizeThreshold:对象大于此值时,直接放入老年代。(单位为字节);

常见内存溢出

  • 堆内存溢出:OutOfMemoryError: Java heap space 
  • 非堆内存溢出:OutOfMemoryError: PermGen space 
  • 无法创建新的线程:OutOfMemoryError: unable to create new native thread.

查看JVM内存信息 

  • Runtime.getRuntime().maxMemory(); //最大可用内存,对应-Xmx 
  • Runtime.getRuntime().freeMemory(); //当前JVM空闲内存 
  • Runtime.getRuntime().totalMemory(); //当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和

注意: 

  • 增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。 
  • Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
  • 一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成。 


回收器选择
JVM给了三种选择:串行收集器、并行收集器、并发收集器。串行收集器只适用于小数据量的情况。
1,吞吐量优先的并行收集器
(1)-XX:+UseParallelGC -XX:ParallelGCThreads=20
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
(2)-XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。
(3)-XX:+UseParallelGC  -XX:MaxGCPauseMillis=100
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
(4)-XX:+UseParallelGC  -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
2,响应时间优先的并发收集器
(1)-XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。
-XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
(2)-XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片。

JVM内存设置
1,eclipse全局设置:在eclipse.ini中加入参数。
2,eclipse所有工程设置: window-preferences-Java-Installed JREs -Edit-Default VM Arguments中加入参数。
3,eclipse单个工程设置:Debug As–>Debug Configurations–>Arguments–>VM arguments 或Run As–>Run Configurations–>Arguments–>VM arguments中加入参数。
4,tomcat设置:在tomcat/bin 目录下的catalina.sh添加JAVA_OPTS=’-Xms1g -Xmx1g’
5,jar包设置:放到启动命令中 nohup java $JAVA_OPTS -Xmx1g -Xms1g -Xmn512m -Xss1m -jar packageName.jar >nohup 2>&1 &

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值