JVM调优

来源:互联网 发布:linux如何安装hadoop 编辑:程序博客网 时间:2024/06/04 22:46

java内存结构

stack:每个方法对应一个栈帧(线程),每个栈帧里都存在这个方法的局部变量

method area(永久区permanent):静态变量、字符串常量、class文件

heap堆:内存中最大区域

程序计数器:程序执行时用到的临时寄存器


java1.8:堆内存分为新生代和老年代,新生代又分为2个survivor和一个eden

new对象时,特别大的放到老年代,其他放到新生代。经历过一次gc后,这个对象还有引用指向它,此时这个对象跑到一个survivor。反复gc多次,对象在两个survivor之间循环移动。

如果多次gc后,对象仍然在两个survivor之间往复,则将其放入老年代。

回收eden和s1 s2中的垃圾,称为minor GC,内存中所有对象都会维护一个计数器,每进行一次GC这个对象的计数器都会加一,当该值达到阈值时,会将该对象移入老生代。该阈值可配置:JVM参数XX:MaxTenuringThreshold


如何确定垃圾?

String s = new String(),s一般放在stack里面,对象放在heap里面。

s = null,此时没有引用指向这个new出来的对象,这个对象就是垃圾。(这个方法不能涵盖循环引用)。java引用包括:强引用,软引用,弱引用,虚引用。

采用正向可达算法确定垃圾:从roots对象计算可到达的对象就不是垃圾。


垃圾收集算法:

mark-sweep标记清除

copying复制

mark-compact标记压缩


jvm参数说明

- 稳定参数,所有jvm必须有

-X 非标参数,每个jvm实现都不同

-XX 不稳定参数,下一个版本可能会取消