JVM优化了解下【干货】

作为三年的开发程序员,如果JVM还不是太了解的话,那就太菜了,说出去丢人,仅是我个人的理解。

JVM优化了解下【干货】

主要说下JVM内存结构以及怎么使用方案。


Java内存结构(各个部分都有什么作用)

JVM优化了解下【干货】
主要流程就是一个java文件被编译为Class文件之后,然后被机器处理(包括运行到回收得过程),然后去本地方法操作

参数详解:
1.类加载器:主要是用来加载类文件
2.方法区:也成为永久区,存储的是被static修饰变量,类的信息、常量信息、常量池信息、包括字符串字面量和数字常量等,方法区线程之前线程是共享的。定义太多变量会出现内存溢出
3.JAVA堆:存储被new过的对象,数组。线程之间共享。定义太多变量会出现内存溢出。
堆分为年轻代和老年代,年轻代分为edn区,S0和S1,但是S0和S1分到的区域是一样大的,目的就是为了垃圾复制算法。

JVM优化了解下【干货】

ps:垃圾回收机制一般回收的新生代的内存,但有时候也会回收老年代的内存(次数较少)
4.JAVA栈:存放局部变量,方法。线程之间不共享,执行得是JAVA方法服务
栈是一块线程私有的空间,栈也分为局部变量表,操作数栈,动态连接,出口以及其他

JVM优化了解下【干货】
局部变量表:主要就是报错函数的参数及局部变量
操作数栈:用于计算过程结果,同时作为临时的一个计算空间。
动态连接:操作局部变量表,操作数栈,同时还会报出一些异常。
出口:报异常,以及返回值。

5.本地方法栈:调用本地方法的,本地方法栈也会抛出*Error和OutOfMemoryError异常。
6.垃圾收集器:主要是对堆内存中不可达对象进行不定期的回收,回收得是年轻代的内存,但是为了优化,尽可能的减少垃圾回收得次数,不管是对年轻代还是老年代老说。垃圾回收机制算法分析【干货】
7.PC寄存器:存放当前执行环境指针、程序技术器、操作栈指针、计算的变量指针等信息


<h3 id="two’>从那个几个方面优化

a).减少垃圾回收的次数(将堆的初始值内存和堆的最大内存设置一致)
-Xms20	m -Xmx20m
b).减少变量的定义(能够避免内存溢出)
c).设置新声代,年老代的比例
-Xmn    新生代大小,一般设为整个堆的1/31/4左右
-XX:SurvivorRatio    设置新生代中eden区和from/to空间的比例关系n/1


常用参数详解


------堆设置:

  -Xms:初始堆大小

  -Xmx:最大堆大小

  -XX:NewSize=n:设置年轻代大小

  -XX:NewRatio=n:设置年轻代和年老代的比值。如:3,表示年轻代与年老代比值为13,年轻代占整个年轻代年老代和的1/4

  -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=32,一个Survivor区占整个年轻代的1/5

  -XX:MaxPermSize=n:设置持久代大小

------收集器设置

-XX:+UseSerialGC:设置串行收集器

  	-XX:+UseParallelGC:设置并行收集器

  	-XX:+UseParalledlOldGC:设置并行年老代收集器

  	-XX:+UseConcMarkSweepGC:设置并发收集器

------垃圾回收统计信息

-XX:+PrintGC

  	-XX:+PrintGCDetails

  	-XX:+PrintGCTimeStamps

  	-Xloggc:filename

------并行收集器设置

-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。

  	-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

  	-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

------并发收集器设置

-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。

  	-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
ps:Eclipse可设置实时关注内存:

window ------> Preferences ------> General ------> 右侧中 Show Heap Status
如图:JVM优化了解下【干货】


内存溢出原因及解决办法

内存溢出原因:

主要就是出现递归调用的方法,但是循环也能够产生递归,也会出现这种问题。

内存溢出解决方案:
去Tomcat 中bin 目录下 的 catalina.sh 修改JVM堆内存大小
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"

在实战中学习,在快乐中成长