前言
今天就来介绍一下从小白到神的,以便让微信可以正常支付,JVM不得不知道的一些参数配置
JVM 参数详解通用 JVM 参数-server
如果不配置该参数,但是绑定银行卡后我们需要打开这几个设置,JVM 会根据应用服务器硬件配置自动选择不同模式,才能让我们的资金更安全!一、隐藏钱包金额我们在打开微信钱包界面时,server 模式启动比较慢,都可以看到钱包底下会显示具体金额!这样让别人看到就显得很不安全了,但是运行期 速度得到了优化,所以我们要给它隐藏起来!打开微信,适合于服务器端运行的 JVM。
-client
启动比较快,找到【支付】在【支付】页面选择【钱包】然后找到【安全保障】打开【安全保障】之后,但是运行期响应没有 server 模式的优化,往下找到【金额隐私保护】点击它然后将【隐藏钱包入口下方金额】开关开启就可以了!此时我们返回到钱包就看不到具体金额了!二、开启应用锁我们的微信,适合于个人 PC 的服务和测试。
-Xmx
设置 java heap 的最值,默认情况都是点击图标就能直接进入,默认是机器物理内存的 1/4。这个值决定了最多可用的 Java 堆内存:分配过少就会在 应用中需要量内存作缓存或者临时对象时出现 OOM(Out Of Memory)的问题;如果分配过,万一我们把手机丢失或者不慎忘记在朋友家里了,那么就会因 PermSize 过小而引起的另外一种 Out Of Memory。所以如何配置还是根据运行过程中的分析和计算来确定,那么朋友直接点击微信就可以进去直接操作,如果不 能确定还是采用默认的配置。
-Xms
设置 Java 堆初始化时的小,默认情况是机器物理内存的 1/64。这个主要是根据应用启动时消耗的资源决定,分配少了申请起来会降低运行速度,分配多了也浪费。
-XX:PermSize
初始化永久内存区域小。永久内存区域全称是 Permanent Generation space,是指内存的永久保存区域,程序 运行期不对 PermGen space 进行清理,所以如果你的 APP 会 LOAD 很多 CLASS 的话,就很可能出现 PermGen space 错误。这种错误常见在 web 服务器对 JSP 进行 pre compile 的时候。如果你的 WEB APP 下用了量的第三方 jar,其小超过了 jvm 默认的 PermSize 小(4M)那么就会产生此错误信息了。
-XX:MaxPermSize
设置永久内存区域最小。
-Xmn
直接设置青年代小。整个 JVM 可用内存小=青年代小 + 老年代小 + 持久代小 。持久代一般固定 小为 64m,所以增年轻代后,将会减小老年代小。此值对系统性能影响较,Sun 官方推荐配置为整个堆的 3/8。
按照 Sun 的官方设置比例,则上面的例子中年轻代的小应该为 2048*3/8=768M。
-XX:NewRatio
控制默认的 Young 代的小,例如,设置-XX:NewRatio=3 意味着 Young 代和老年代的比率是 1:3。换句话说, Eden 和 Survivor 空间总和是整个堆小的 1/4。
如图中的实际设置,-XX:NewRatio=2,-Xmx=2048,则年轻代和老年代的分配比例为 1:2,即年轻代的小为 682M, 而老年代的小为 1365M。查看实际系统的 jvm 监控结果为:
内存池名称: Tenured Gen
Java 虚拟机最初向操作系统请求的内存量: 3,538,944 字节
Java 虚拟机实际能从操作系统获得的内存量: 1,431,699,456 字节
Java 虚拟机可从操作系统获得的最内存量: 1,431,699,456 字节。请注意,并不一定能获得该内存量。
Java 虚拟机此时使用的内存量: 1,408,650,472 字节
即:1,408,650,472 字节=1365M,证明了上面的计算是正确的。
-XX:SurvivorRatio
设置年轻代中 Eden 区域 Survivor 区的小比值。设置为 4,则两个 Survivor 区域一个 Eden 区的比值为 2:4, 一个 Survivor 区占整个年轻代的 1/6。越的 survivor 空间可以允许短期对象尽量在年青代消亡;如果 Survivor 空 间太小,Copying 收集将直接将其转移到老年代中,这将加快老年代的空间使用速度,引发频繁的完全垃圾回收。
SurvivorRatio 的值设为 3,Xmn 为 768M,则每个 Survivor 空间的小为 768M/5=153.6M。
-XX:NewSize
为了实现更好的性能,您应该对包含短期存活对象的池的小进行设置,以使该池中的对象的存活时间不会超过一个垃圾回收循环。新生成的池的小由 NewSize 和 MaxNewSize 参数确定。通过这个选项可以设置 Java 新对象生产堆内存。在通常情况下这个选项的数值为 1024 的整数倍并且于 1MB。这个值的取值规则为,一般情况下这个值-XX:NewSize 是最堆内存(maximum heap size)的四分之一。增加这个选项值的小是为了增较数量的短生命周期对象。增加 Java 新对象生产堆内存相当于增加了处理器的数目。并且可以并行地分配内存,但是请注意内存的垃圾回收却是不可以并行处理的。作用跟-XX:NewRatio 相似,-XX:NewRatio 是设置比例而-XX:NewSize 是设置精确的数值。
-XX:MaxNewSize
通过这个选项可以设置最 Java 新对象生产堆内存。通常情况下这个选项的数值为 1024 的整数倍并且于 1MB,其功用与上面的设置新对象生产堆内存-XX:NewSize 相同。一般要将 NewSize 和 MaxNewSize 设成一致。
-XX:MaxTenuringThreshold
设置垃圾最年龄。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入老年代。对于老年代比较多的应用,可以提高效率。如果将此值设置为一个较值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代即被回收的概率。
-XX:MaxTenuringThreshold 参数被设置成 5,表示对象会在 Survivor 区进行 5 次复制后如果还没有被回收才会 被复制到老年代。
-XX:GCTimeRatio
设置垃圾回收时间占程序运行时间的百分比。该参数设置为 n 的话,则垃圾回收时间占程序运行时间百分比的公式为 1/(1+n) ,如果 n=19 表示 java 可以用 5%的时间来做垃圾回收,1/(1+19)=1/20=5%。
-XX:TargetsurvivorRatio
该值是一个百分比,控制允许使用的救助空间的比例,默认值是 50。该参数设置较的话可提高对 survivor 空间的使用率。当较的堆栈使用较低的 SurvivorRatio 时,应增加该值到 80 至 90,以更好利用救助空间。
-Xss
设置每个线程的堆栈小,根据应用的线程所需内存小进行调整,在相同物理内存下,减小这个值能生成更 多的线程。
但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。当这个选项被设置的较(>2MB)时将会在很程度上降低系统的性能。因此在设置这个值时应该格外小心,调整后要注意观察系统的性能,不断调整以期达到最优。
JDK5.0 以后每个线程堆栈小为 1M,以前每个线程堆栈小为 256K。
-Xnoclassgc
这个选项用来取消系统对特定类的垃圾回收。它可以防止当这个类的所有引用丢失之后,这个类仍被引用时不会再一次被重新装载,因此这个选项将增系统堆内存的空间。禁用类垃圾回收,性能会高一点;
串行收集器参数-XX:+UseSerialGC
设置串行收集器 。
并行收集器参数-XX:+UseParallelGC
选择垃圾收集器为并行收集器,此配置仅对年轻代有效,即上述配置下,年轻代使用并行收集,而老年代仍旧使用串行收集。采用了多线程并行管理和回收垃圾对象,提高了回收效率,提高了服务器的吞吐量,适合于多处理器的服务器。
-XX:ParallelGCThreads
配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
-XX:+UseParallelOldGC
采用对于老年代并发收集的策略,可以提高收集效率。JDK6.0 支持对老年代并行收集。
-XX:MaxGCPauseMillis
设置每次年轻代并行收集最暂停时间,如果无法满足此时间,JVM 会自动调整年轻代小以满足此值。
-XX:+UseAdaptiveSizePolicy
设置此选项后,并行收集器会自动选择年轻代区小和相应的 Survivor 区比例,以达到目标系统规定的最低响 应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
并发收集器参数-XX:+UseConcMarkSweepGC
指定在 老年代 使用 concurrent cmark sweep gc。gc thread 和 app thread 并行 ( 在 init-mark 和 remark 时 pause app thread)。app pause 时间较短 , 适合交互性强的系统 , 如 web server。它可以并发执行收集操作,降低应用停止时间,同时它也是并行处理模式,可以有效地利用多处理器的系统的多进程处理。
-XX:+UseParNewGC
指定在 New Generation 使用 parallel collector, 是 UseParallelGC 的 gc 的升级版本 , 有更好的性能或者优点 , 可以和 CMS gc 一起使用
-XX:+UseCMSCompactAtFullCollection
打开对老年代的压缩。可能会影响性能,但是可以消除碎片,在 FULL GC 的时候,压缩内存,CMS 是不会移动内存的,因此,这个非常容易产生碎片,导致内存不够用,因此,内存的压缩这个时候就会被启用。增加这个参数是个好惯。
-XX:+CMSIncrementalMode
设置为增量模式。适用于单 CPU 情况
-XX:CMSFullGCsBeforeCompaction
由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次 GC 以后对内存空间进行压缩、整理。
-XX:+CMSClassUnloadingEnabled
使 CMS 收集持久代的类,而不是 fullgc
-XX:+CMSPermGenSweepingEnabled
使 CMS 收集持久代的类,而不是 fullgc。
-XX:-CMSParallelRemarkEnabled
在使用 UseParNewGC 的情况下 , 尽量减少 mark 的时间
-XX:CMSInitiatingOccupancyFraction
说明老年代到百分之多少满的时候开始执行对老年代的并发垃圾回收(CMS),这个参数设置有很技巧,基本上满足公式:
(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn
时就不会出现 promotion failed。在我的应用中 Xmx 是 6000,Xmn 是 500,那么 Xmx-Xmn 是 5500 兆,也就是老年代有 5500 兆,CMSInitiatingOccupancyFraction=90 说明老年代到 90%满的时候开始执行对老年代的并发垃圾回 收(CMS),这时还剩 10%的空间是 5500*10%=550兆,所以即使 Xmn(也就是年轻代共 500 兆)里所有对象都搬到老年代里,550 兆的空间也足够了,所以只要满足上面的公式,就不会出现垃圾回收时的 promotion failed;
如果按照 Xmx=2048,Xmn=768 的比例计算,则 CMSInitiatingOccupancyFraction 的值不能超过 40,否则就容易 出现垃圾回收时的 promotion failed。
-XX:+UseCMSInitiatingOccupancyOnly
指示只有在老年代在使用了初始化的比例后 concurrent collector 启动收集
-XX:SoftRefLRUPolicyMSPerMB
相对于客户端模式的虚拟机(-client 选项),当使用服务器模式的虚拟机时(-server 选项),对于软引用(soft reference)的清理力度要稍微差一些。可以通过增-XX:SoftRefLRUPolicyMSPerMB 来降低收集频率。默认值是 1000,也就是说每秒一兆字节。Soft reference 在虚拟机中比在客户集中存活的更长一些。其清除频率可以用命令行 参数 -XX:SoftRefLRUPolicyMSPerMB= 来控制,这可以指定每兆堆空闲空间的 soft reference 保持存活(一旦 它不强可达了)的毫秒数,这意味着每兆堆中的空闲空间中的 soft reference 会(在最后一个强引用被回收之后) 存活 1 秒钟。注意,这是一个近似的值,因为 soft reference 只会在垃圾回收时才会被清除,而垃圾回收并不总在 发生。
-XX:LargePageSizeInBytes
内存页的小,不可设置过,会影响 Perm 的小。
-XX:+UseFastAccessorMethods
原始类型的快速优化,get,set 方法转成本地代码。
-XX:+DisableExplicitGC
禁止 java 程序中的 full gc, 如 System.gc() 的调用。最好加上防止程序在代码里误用了,对性能造成冲击。
-XX:+AggressiveHeap
特别说明下:(我感觉对于做 java cache 应用有帮助)
试图是使用量的物理内存
长时间内存使用的优化,能检查计算资源(内存,处理器数量)
至少需要 256MB 内存量的 CPU/内存, (在 1.4.1 在 4CPU 的机器上已经显示有提升)
-XX:+AggressiveOpts
加快编译
-XX:+UseBiasedLocking
锁机制的性能改善
感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞关注。