jvm
jvm内存模型:
jvm虚拟机主要有堆,栈,本地方法栈,以及方法区,和程序计数器组成。
堆:存放对象的地方,new出来的都在堆里面。
栈:
一般是有多个栈帧组成的,是一个先进后出的栈。栈帧里面主要有局部变量表,操作数栈,以及动态链接和方法出口组成。局部变量new对象的话会指向堆里面的对象。
栈帧:
一个方法会存放到一个栈里面,为什么要用栈呢?可以先进后出。和我们方法的嵌套调用的方式吻合。
局部变量表:存放局部变量的地方
操作数栈:存放临时操作的临时空间。
动态链接:是属于引用方法的一个入口地址·
方法出口:是在方法执行完成后的一个出口。
程序计数器:会记录在栈里面的程序+-操作的下一步的地址。
方法区:
存放常量以及静态变量,以及类信息的。里面有对象的变量同样会指向堆里面的对象。在jdk1.8之前叫 永久代 ,1.8之后叫 元空间
本地方法栈:当调用的不是java的方法的时候,就会在本地方法栈里面分配一块内存空间出来。
STW机制:stop the word
什么是swt机制,就是说在做fullgc的时候会停掉整个线程。
为什么要设置stw机制?
如果线程结束了,gc还没有结束的话,线程的很多东西都要突然被全部回收,就会有问题。量太大了,回收不过来。然后我们的解决办法就是用stw机制,在回收的时候就停止用户线程。
调优思路:
在日常使用中,我们要尽量避免fullgc,因为full gc的时候会停掉用户的线程,而且时间比minorgc长。所以我们就要尽量避免被放到老年代里面去。假如我们幸存区有100m但是我们的一个幸存对象就有60m,这个时候就不会被放到幸存区,因为有一个算法,当幸存的对象达到幸存区域的一半以上就会直接被放到老年代。我们可以设计把幸存区的内存调大,这样就可以避免一下来60m会直接到fullgc里面去了。这样就可以提高性能。
eden区,幸存区service,前两者属于新生代为总的3分之一。还有就是老年区域为三分之二。edan为8:1:1
什么是minorgc ?当新生代要满的时候就会发生minor gc 对其进行回收。如果改对象幸存下来就会进入service区域然后年龄加一。当在发生minor gc 的时候,service区的对象又会到另一个幸存区域去,当年龄大于15的时候就会到老年代去。
软引用弱引用强引用,虚引用
若有收获,就点个赞吧