zoukankan      html  css  js  c++  java
  • JVM----内存模型

    -XX:+PrintGCDetails:程序运行的时候打印堆的大小。如果发生GC,会打印GC日志

    -Xss:设置的大小是一个线程开辟的空间,设置的越大,系统可开辟的线程数量越少,默认是1M

    -Xms:堆最小空间

    -Xmx:堆最大空间

    -Xmn:年轻代

    -XX:MetaspaceSize:方法区(jdk1.8)

    -XX:MaxMetaspaceSize

    -XX:PretenureSizeThreshold=1024*1024*10 -XX:+UseSerialGC   大于10M的对象会直接放到年老代

    SpringBoot程序JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里)

    java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -jar xx.jar
    

    如何设置

      根据每秒处理请求数量✖️产生对象大小,设置成年轻代大小

    年轻代设置过小,在高并发的情况下,很频繁发生minor GC,有些请求对象还没有结束,经过频繁GC之后,容易将这些垃圾对象放到老年代。

     

    JVM虚拟机

    栈:最重要就是栈帧

    栈帧,每一个方法都会开辟一个栈帧,栈帧包括局部变量表,操作数栈,动态链接,方法出口。

      在堆中的对象,每个对象头,保存指向方法区中类元数据的指针。

    方法区

      方法区中类元数据中的静态变量对象指向堆。

      方法区是一个概念,实现方式在jdk 1.8之前是持久带,1.8之后是元空间

    直接引用和符号引用

      像class,方法名字,方法变量,‘computer’,‘()’,这些都是符号都是一个符号,这些符号保存在常量池中。

      new Math()

      math.computer();

      当我们调用math.computer(),computer(),是组合的符号,此时进行动态链接,将computer(),符号引用变成直接引用,保存在栈帧中的动态链接中。

      直接引用指向 方法区保存着computer指令码 的入口

    逃逸分析

      JVM运行的模式:解释,编译,混合(JVM采用),如果全部吧代码翻译成机器吗,机器码的代码量多,如果全部加载到内存,会占用大量内存。

      在编辑过程中,jvm对我们代码进行优化,比如对象逃逸分析等。

      jdk1.7之后默认开启逃逸分析,逃逸分析本质就是对象创建在栈内存中,方法结束,对象立即回收,那么什么样的对象应该放到栈中呢,就是方法中创建的对象没有逃出该方法。例如

    public class Test{
    
        //该方法中的user对象逃出了方法;
        public User A(){
            User user = new User();
            return user;
        }
    
        //该方法中的user对象没有逃出方法;
        public void B(){
            User user = new User();
        }
    }
    

      

  • 相关阅读:
    django LDAP
    Python egg
    皮皮书屋
    Linux运维
    bash shell 快捷键汇总
    linux ldconfig
    Linux set env export declare unset
    OpenStack
    【LeetCode】258. Add Digits
    一个"Median Maintenance"问题
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/14012171.html
Copyright © 2011-2022 走看看