一、概念
jvm(java virtual machine),即java虚拟机
sun的jdk 引擎是hotspot,默认方式为client,用于桌面程序引擎,内存较小,
可以修改为server,用于BS架构项目,内存较大
Jvm结构
1,类加载子系统 启动时,加载文件或网络类加载到方法区
2,方法区 将class加载到这里,包括常量等
3,Java堆 * 几乎说有的实例都放在java堆里,堆空间在线程中是共享的
4,直接内存
5,java桟 随线程一同生死,各个线程私有的,不用回收
6,本地方法桟 随线程一同生死,各个线程私有的,不用回收
7,垃圾回收器 *
8,PC寄存器 随线程一同生死,各个线程私有的,不用回收
9,执行引擎
java堆内存分为三代
新生代、Eden-From-To
老年代、Old
永久代、Permanent
(1.4之前没有永久代,1.7之后打算去掉永久代)
为什么分三代?
java堆是虚拟机管理的最大一块内存,也是使用最频繁的,所有对象实例都在这里存放,
分带处理可以对不同代的内存,实现垃圾回收的算法和频次的差异,从而提高
内存分配和垃圾回收的效率
二,垃圾回收算法
1,引用计数 reference counting
2,复制 copying
3,标记清除 mark-sweep
4,标记整理 mark-compact
三,垃圾收集器
两类:
次收集器
Scavenge GC
当年轻堆内存空间不足时触发,收集频率高
Full GC
老年代或永久代空间满了,会触发
可以主动调用System.gc()来启动
分带回收器
新生代收集器
1,串行 Serial 单线程收集器,是第一代收集器 在收集时必须暂停所有工作线程再收集垃圾,采用复制算法
2,ParNew ,是Serial的多线程版本,提高了收集的性能,要有多核CPU下运行
3,Parallel scavenge 并行收集器,用于提升收集的吞吐量来提升效率
老年代收集器
4,Serial Old 采用标记整理算法
5,Parallel Old 采用标记整理算法
6,CMS concurrent mark sweep 具有划时代意义的收集器,在主流互联网站使用的
7,G1 gabage first 可以对新生代和老年代都使用的收集器
jvm工具和插件
工具:{JAVA_HOME}\bin \jvisualvm.exe
插件:visualGC
jvm优化项
1,配置jvm的执行引擎参数:server还是client
2,手动分配java桟的内存空间
3,选择合适的垃圾收集器
具体优化方案,跟主机的物理配置有极大关系 主要参考值,机器上可以用的CUP和内存
-server -Xmx3550m -Xms3550m -Xmn1256m -Xss128k -XX:SurvivorRatio=6 -XX:MaxPermSize=256m
-XX:+UseConcMarkSweepGC
-server 选择server引擎
-Xmx3550m:设置JVM最大堆内存为3550M。
-Xms3550m:设置JVM初始堆内存为3550M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存
-Xmn1256m:设置年轻代堆内存为1256M
-Xss128k: 设置每个线程的堆栈大小 jdk1.5以后可以设置为1M,较大的应用可设置256k
-XX:SurvivorRatio=6: 设置End区和Survivor区的比例为8:2
-XX:MaxPermSize=256m: 设置最大持久带最大值 256m
-XX:+UseConcMarkSweepGC 使用CMS垃圾回收器
实践:
以springboot项目为例,启动方式:
1,java -jar **.jar -server -Xmx3550m -Xms3550m -Xmn1256m -Xss128k -XX:SurvivorRatio=6 -XX:MaxPermSize=256m
-XX:+UseConcMarkSweepGC
2,tomcat启动,在catalina.bat中增加代码:
set JAVA_OPTS=-Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
启动tomcat
3,开发人员启动时,在run或者debug时,打开configurations,在arguments的VM arguments中填写
-Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC