Java回收机制
Jvm内存机制:
为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。
整体来划分,整个java内存划分为堆区和方法区。有没有被使用
Java堆在虚拟机启动时创建,主要目的是存放对象实例。细分分为年轻代和老年代。其中年轻代又分为一个eden区和2个survivor区(s0from,s1to)。对象只会存在于Eden区和名为“From”的Survivor区。Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置,默认15)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满(达到年龄阈值的时候),“To”区被填满之后,会将所有对象移动到年老代中。
年老代内存里包含了长期存活的对象和经过多次Minor GC后依然存活下来的对象。通常会在老年代内存被占满时进行垃圾回收。老年代的垃圾收集叫做Major GC。Major GC会花费更多的时间。
年轻代的对象临时对象比较多,执行起来非常快,Minor GC会检查所有存活的对象,可能出现响应时间长,应尽量减少。所以要优化。
-Xms | 设置JVM启动时堆的初始化大小。 |
-Xmx | 设置堆最大值。 |
-Xmn | 设置年轻代的空间大小,剩下的为老年代的空间大小。 |
-XX:PermGen | 设置非堆区内存的初始化大小。 |
-XX:MaxPermGen | 设置非堆区的最大值。 |
-XX:SurvivorRatio | 提供Eden区和survivor区的空间比例。比如,如果年轻代的大小为10m并且VM开关是-XX:SurvivorRatio=2,那么将会保留5m内存给Eden区和每个Survivor区分配2.5m内存。默认比例是8。 |
-XX:NewRatio | 提供年老代和年轻代的比例大小。默认值是2。 |
Catalina.out /startup.sh
或者是在起服务的地方。
export CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote=true //设置访问权限
-Djava.rmi.server.hostname=172.16.205.37 //ip
-Dcom.sun.management.jmxremote.port=9999 //配置的端口号
-Dcom.sun.management.jmxremote.ssl=false //jconsole的远程加密
-Dcom.sun.management.jmxremote.authenticate=false"//为false时不需要输入用户名和密码