【JVM】OOM与调优(一)

打印 上一主题 下一主题

主题 512|帖子 512|积分 1538

OOM与调优

方法区


  1. import net.sf.cglib.proxy.Enhancer;
  2. import net.sf.cglib.proxy.MethodInterceptor;
  3. import net.sf.cglib.proxy.MethodProxy;
  4. import java.lang.reflect.Method;
  5. public class MetaspaceOverFlowTest {
  6.     /**
  7.      * 模拟CGLIB向元空间写入数据
  8.      */
  9.     public static void main(String[] args) {
  10.         while (true) {
  11.             try {
  12.                 Thread.sleep(10);
  13.             } catch (InterruptedException e) {
  14.                 throw new RuntimeException(e);
  15.             }
  16.             Enhancer enhancer = new Enhancer();
  17.             enhancer.setSuperclass(MetaspaceOverFlowTest.class);
  18.             enhancer.setUseCache(false);
  19.             enhancer.setCallback(new MethodInterceptor() {
  20.                 @Override
  21.                 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  22.                     return methodProxy.invokeSuper(o, args);
  23.                 }
  24.             });
  25.             System.out.println("running ....");
  26.             enhancer.create();
  27.         }
  28.     }
  29. }
复制代码
模拟OOM
查看方法区利用环境

在设置Java环境的环境下,直接打开下令行输入jvisualvm下令即可打开
  1. C:\Users\87766>jvisualvm
复制代码
然后在左边找到我们的程序,右边是查看图形

查看GC环境需要安装一个插件Visual GC,左上方工具栏安装即可

GC日记

  1. [GC (Metadata GC Threshold) [PSYoungGen: 9003K->672K(64512K)] 16030K->9067K(236544K), 0.0038284 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
  2. [Full GC (Metadata GC Threshold) [PSYoungGen: 672K->0K(64512K)] [ParOldGen: 8395K->8858K(74752K)] 9067K->8858K(139264K), [Metaspace: 20138K->20138K(32768K)], 0.0648738 secs] [Times: user=0.02 sys=0.00, real=0.07 secs]
  3. ```![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4bd6eccf56664bd8b1d467cb6f906d1d.png)
  4. ### 调优参数
  5. ```bash
  6. -XX:MetaspaceSize=20M -XX:MaxMetaspaceSize=20M -XX:+PrintGCDetails
复制代码
原则:最大、最小设置成一样大,避免因内存分配不敷而引发扩容
程序运行起来后,通过VisualVM、Arthas查看占用了多少内存,向上调优,预留20%以上的空间
堆区


  1. public class HeapOverFlowTest1 {
  2.     int[] intArr = new int[10];
  3.     public static void main(String[] args) {
  4.         List<HeapOverFlowTest1> list = new ArrayList<HeapOverFlowTest1>();
  5.         for (;;) {
  6.             try {
  7.                 Thread.sleep(1);
  8.             } catch (InterruptedException e) {
  9.                 e.printStackTrace();
  10.             }
  11.             list.add(new HeapOverFlowTest1());
  12.         }
  13.     }
  14. }
复制代码
模拟OOM
调优vm参数

  1. -Xms10m -Xmx10m -XX:+PrintGCDetails
复制代码
jvisualvm查看gc环境


gc日记

  1. [GC (Allocation Failure) [PSYoungGen: 1120K->469K(2048K)] 7372K->6786K(9216K), 0.0021594 secs] [Times: user=0.00 sys=0.02, real=0.01 secs]
  2. [GC类型(GC原因)[新生代收集器:gc前新生代的内存使用情况->gc后新生代的内存使用情况(新生代总内存)]gc前堆内存的使用情况->gc后堆内存的使用情况(堆总内存), gc耗时][TImes:gc阶段用户空间耗时 gc阶段内核空间耗时,gc阶段实际耗时]
  3. [Full GC (Ergonomics) [PSYoungGen: 469K->0K(2048K)] [ParOldGen: 6316K->5603K(7168K)] 6786K->5603K(9216K), [Metaspace: 9480K->9410K(1058816K)], 0.0488684 secs] [Times: user=0.08 sys=0.02, real=0.05 secs]
  4. [GC类型(GC原因)[新生代垃圾收集器:gc前新生代的内存使用情况->gc后新生代的内存使用情况(新生代总内存)][老年代垃圾收集器:gc前老年代的内存使用情况->gc后老年代的内存使用情况(老年代总内存)]gc前堆内存的使用情况-> gc后堆内存的使用情况(堆总内存),[Metaspace:gc前元空间的内存使用情况-> gc后元空间的内存使用情况(元空间总内存)], gc耗时][Times:gc阶段用户空间耗时 gc阶段内核空间耗时,gc阶段实际耗时]
复制代码
调优原则:



  • 1.预留30%以上的空间
  • 2.周期性看日记,重点关注Full GC频率
3.虚拟机栈


  1. public class StackOverFlowTest {
  2.     private int val = 0;
  3.     public void test() {
  4.         val++;
  5.         test();
  6.     }
  7.     public static void main(String[] args) {
  8.         StackOverFlowTest test = new StackOverFlowTest();
  9.         try {
  10.             test.test();
  11.         } catch (Throwable e) {
  12.             e.printStackTrace();
  13.             System.out.println(test.val);
  14.         }
  15.     }
  16. }
复制代码
模拟OOM
调优参数

-Xss200k 默认1M
4.直接内存

JVM进程的堆与运行时数据区平行


  • 1.Unsafe.allocateMemory
  • 2.ByteBuf.allocateDirect(NIO)
怎么调优?不调优会怎样?(默认是不受限制)
模拟OOM


模拟OOM,可以看到触发了利用体系的SIGKILL信号机制(signal 9:SIGKILL),但是这个日记怎么查看呢
怎样查看Linux内核日记呢?

  1. dmesg -T
复制代码

5.调优参数类型



  • 1.KV类型:-XX:MetaspaceSize=10M
  • 2.boolean类型:-XX:+UseCompressedOops
  • 3.简写类型:-Xms10m

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表