了解jvm调优:
调什么:
1:调整FULL GC(垃圾回收)的执行频率 越少越好
2:调整FULL GC(垃圾回收)的执行时间 越短越好
首先要了解JVM模型:
JVM里有五大空间:
方法区,堆,java栈,native栈(本地方法栈),程序计数器
方法区:存储常量池、全类名....固定的不会被回收的数据,还有静态变量
堆:对象(所以对象new出的对象)
java栈:栈帧(有点像方法)
native栈:用来对接其他语言的 例如对接C语言:用java获取系统时间,获取CPU的温度(native修饰的方法)
程序计数器
五大区有可以分为两大块:
线程共享区(这里面的东西会引起线程安全问题)
线程私有区(每个线程都有一份不会引起线程安全问题,只有成员属性或静态属性才会存在线程安全问题,方法属性是不存在线程安全的因为它是线程私有的)
下面一个一个讲:
线程私有区:
java栈:
先进后出
存储栈帧的(栈帧可以等于java中的方法,但又不完全等于)
局部变量和操作数栈都是用来记录JVM指令的执行的(数据在两个之间相互推送);
程序计数器:
线程执行到5被人给抢走了,再拿到线程它怎么知道走到哪里了
就需要程序计数器(记录JVM指令执行的行数)下个线程来就从5继续执行
终结:栈里存的栈帧;栈帧就是来执行jvm指令的执行操作;stackOverFoll(栈内存溢出),如果是方法过多就是栈帧溢出,如果是属性值太多就是操作数栈溢出
总结:
JVM有五大区,方法区,堆,java栈,native栈(本地方法栈),程序计数器;这五大区可以分为两大块:线程共享区;线程私有区;
线程私有区中比较重要的就是Java栈,栈中存储的是栈帧,栈帧可以理解为方法,它里面有四块,返回地址:记录程序的执行行数,如果抛异常是它来记录错误行数的;动态连接:写代码的时候有时候一个对象会执向多个引用,由它来记录指向的引用对象;局部变量表和操作数栈来记录JVm执行指令的;程序计数器:JVM执行有很多,一个线程不可能一直归你使用,可能执行到一半线程被抢占走了,其他线程就得依靠程序计数器记录JVm指令执行的行数;native栈用来对接其他语言的
字节码文件就是JVM指令
线程共享区:
线程私有区,线程结束就释放掉了;共享区是所有线程都共享的区域
堆:
内存8:1:1
JVM调优调的就是它们的大小,如果执行频率太高,垃圾太多了,老年代就调大一点;如果执行轻GC的频率太高了就把年轻代调大一点;如果from转换太快了就把幸存者区调大一点。
JVM调优工具
JDK自带的jconsole
垃圾回收算法:分代算法,标记清除。。。
finally什么时候不执行?