Jvm及其调优
首先先简单介绍一下jvm是什么?
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。
调优
接下来说说为什么要进行调优,也就是调优的目的
我们的程序在上线之前要进行一系列的测试或者运行,这就会导致一些大大小小的问题,jvm跟C++不一样,因为Jvm实现了内存的自动分配和回收,但这种机制会导致Jvm内存的分配和回收机制不匹配,从而导致各种问题的发生,因为需要对Jvm进行调优,我们需要程序在正常运行的情况下,让用户获得更好的体验。
调优的重要指标
内存占用:程序正常运行需要的内存大小。
延迟:由于垃圾收集而引起的程序停顿时间。
吞吐量:用户程序运行时间占用户程序和垃圾收集占用总时间的比值。
当然,和CAP原则(CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得)一样,同时满足一个程序内存占用小、延迟低、高吞吐量是不可能的,程序的目标不同,调优时所考虑的方向也不同,在调优之前,必须要结合实际场景,有明确的的优化目标,找到性能瓶颈,对瓶颈有针对性的优化,最后进行测试,通过各种监控工具确认调优后的结果是否符合目标。
调优可以依赖、参考的数据有:系统运行日志、堆栈错误信息、gc日志、线程快照、堆转储快照等。
Jvm调优的重点是垃圾回收(gc,garbage collection)和内存管理。垃圾回收的时候会导致整个虚拟机暂停服务。因此,应该尽可能地缩短垃圾回收的处理时间。
在JVM启动参数中,可以设置跟内存、垃圾回收相关的一些参数设置,让jvm获得最佳性能
• 针对JVM堆的设置一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值
• 年轻代和年老代将根据默认的比例(1:2)分配堆内存
• 年轻代和年老代设置多大才算合理?这个我问题毫无疑问是没有答案的,否则也就不会有调优。(原则是是减少GC的频率和Full GC的次数)
新生代尽量设置大一些,让对象在新生代多存活一段时间,每次Minor GC 都要尽可能多的收集垃圾对象,防止或延迟对象进入老年代的机会,以减少应用程序发生Full GC的频率。
• 老年代如果使用CMS收集器,新生代可以不用太大,因为CMS的并行收集速度也很快,收集过程比较耗时的并发标记和并发清除阶段都可以与用户线程并发执行。
• 方法区大小的设置,1.6之前的需要考虑系统运行时动态增加的常量、静态变量等,1.7只要差不多能装下启动时和后期动态加载的类信息就行。
百度可以搜索一些常用的JVM参数来配置
Jvm参数使用的两种方式
1.在tomcat中直接配置的
打开tomcat的安装目录, 在bin下修改catalina.bat文件
添加如下:
set “JAVA_OPTS=-Xmx300m -Xms300m -Xmn100m -XX:SurvivorRatio=8”
在这个位置:
2.使用Myecplise,配置JVM参数
双击Tomcat,打开在如下位置,配置:
-Xmx300m
-Xms300m
-Xmn100m
-XX:SurvivorRatio=8
在如下位置即可。