Java内存结构和java内存模型的区别。往往很多人会搞起来。这里主要对这2种进行解释并进行操作。经实践会JVM调优和不会JVM调优差别确实很大,足足可以提升服务器一倍的性能。
java内存结构:所谓的堆,栈,方法区和本地方法栈
java内存模型:
![image.png](https://upload-images.jianshu.io/upload_images/5548226-d8eb4b45d0c4c0d1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-2a4cf209f90325fe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-4b0bece23fa58140.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-987e597fd9a42179.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-1dfb42b0b4e50631.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-4e70673c29aea890.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
这个堆栈分配在idea中设置的地方
![image.png](https://upload-images.jianshu.io/upload_images/5548226-b144b47f3272ea39.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
新生代设置比较小的话,垃圾回收会频繁去回收,否则内存不够用,频繁回收又影响性能,不回收又会导致内存溢出,所以这个配比很关键
一般设置虚拟机内存大小都是为当前PC的内存大小,新生代和老年代的内存比例是1:2,一般老年代都会多点,因为这样可以减少垃圾回收的次数,提高性能。初始堆内存和最大堆内存设置一样。
内存溢出,有栈溢出和堆溢出,栈溢出就像下面的死循环,这个在栈当中申明的int最大只能到一定的数字
![image.png](https://upload-images.jianshu.io/upload_images/5548226-23ae82a306555b49.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-33a7200937cea9cc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
总结:jvm参数调优,主要设置堆内存,主要让gc不要去频繁去回收垃圾,减少对老年代的回收。
![image.png](https://upload-images.jianshu.io/upload_images/5548226-a43bf775dd650b25.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
这里题外介绍个知识点:什么叫守护线程
gc线程就是守护线程:主线程挂了,gc线程也挂了
非守护线程就是主线程挂了,但是new Thread依然在执行。
如果要把非守护线程变成守护线程,需要使用join,例:new Thread().setDeamon();
![image.png](https://upload-images.jianshu.io/upload_images/5548226-6cb4834a8ec75720.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
接下来介绍几个垃圾回收机制的算法
1.引用计算法
![image.png](https://upload-images.jianshu.io/upload_images/5548226-82f5fe7dccd48120.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
2.标记清除算法
![image.png](https://upload-images.jianshu.io/upload_images/5548226-a309a388eab87972.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
3.复制算法。缺点是可用内存是原来内存的一半
![image.png](https://upload-images.jianshu.io/upload_images/5548226-e00d8913e3c6bb38.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
4.标记压缩算法
![image.png](https://upload-images.jianshu.io/upload_images/5548226-d5035c0d5f4ec5f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
5.GC分代算法
就是根据新生代和老年代进行垃圾回收,一般新生代回收的较多,老年代回收的较少,所以应该要避免老年代的gc回收,老年代回收比较慢
垃圾回收时的停顿现象
每次gc回收的时候,其他所有线程都会停顿,如果不停顿的话,那又有可能使用对象,或者新增对象,不便于垃圾清理。
垃圾收集器:
串行回收---单线程(单核回收)
并行回收---多线程(多核回收) 企业用的比较多,性能好
CMS回收---并行GC,用标记清除算法进行回收,性能是最好的,一般用并行回收就可以了
G1回收,是在jdk1.7提出来的,用的比较少
测试接口吞吐量
启动jmeter测试工具,压力测试工具,主要测试网站的吞吐量,就是每秒能被访问多少次
![image.png](https://upload-images.jianshu.io/upload_images/5548226-a86fe6c295222d18.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-91e1fed3ca14515d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-03f97c0b785d88af.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-8559d6718984839e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-6b3a8eb889df4719.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
![image.png](https://upload-images.jianshu.io/upload_images/5548226-b65e237d1b132163.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://images2018.cnblogs.com/blog/1216628/201803/1216628-20180318000649055-2097645129.png)