精华内容
下载资源
问答
  • JVM知识点

    2021-05-06 21:37:11
    JVM知识点前言二、jvm内存模型三、类加载器二、使用步骤1.引入库2.读入数据总结 前言 二、jvm内存模型 三、类加载器 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import ...

    前言

    二、jvm内存模型

    1,栈:什么是栈,用来存放线程的放局部变量空间,每一个线程 分配一块儿,内存地址,
    2,栈帧:栈里面给每个方法 ,分配栈帧,用来存放局部变量
    FILO 先进后出

    javap -c AbstractActivity.class > ll.txt 反编译查看字节码

    3,程序计数器 : 每个线程独有, 程序计数器是用于存放下一条指令所在单元的地址的地方。字节码去修改
    4,方法区:用来存放常量,静态变量,类信息
    5,堆,什么是堆:存放实际的值,栈的内存地址 指向推的。
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    
    /**
     * @ClassName Demo03Test
     * @Description
     * @Author 狗蛋儿
     * @Date 2021/5/10 10:20
     * @Version V1.0
     **/
    public class Demo03Test {
    
        /**
         *   public static  boolean flag = false;
         *   打印:
         *   ==============start
         *   ==============end
         *   volatile  用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值
         */
        public static volatile boolean flag = false;
    
        public static void main(String[] args) {
            new Thread(() -> {
                while (!flag) {
    
                }
                System.out.println("==========success");
            }).start();
    
            try {
                Thread.sleep(2000);
                changeFlag();
            } catch (Exception e) {
    
            }
        }
    
        public static void changeFlag() {
            System.out.println("==============start");
            flag = true;
            System.out.println("==============end");
        }
    }
    console:
    ==============start
    ==============end
    ==========success
    
    
    

    在这里插入图片描述

    public class DoubleCheckLockSingleton {
    
        private static volatile DoubleCheckLockSingleton instance = null;
        /**
         * volatile
         * 高并发下双重检测所DCL指令从排序问题
         * 没有volatile 可能出现 instance已经赋内存地址,但是还没调用init
         *
         * @return
         */
        public static DoubleCheckLockSingleton getInstance() {
            if (Objects.isNull(instance)) {
                synchronized (DoubleCheckLockSingleton.class) {
                    if (Objects.isNull(instance)) {
                        instance = new DoubleCheckLockSingleton();
                    }
                }
            }
            return instance;
        }
        public static void main(String[] args) {
            DoubleCheckLockSingleton.getInstance();
        }
    }
    

    三、jvm调优

    在这里插入图片描述

    四、分销会员登录流程图

    在这里插入图片描述

    展开全文
  • jvm知识点

    2017-10-21 21:05:00
    jvm知识点 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。 JVM 中类的装载是由类加载器(ClassLoader) 和它的...

    jvm知识点

     类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。

    JVM 中类的装载是由类加载器(ClassLoader) 和它的子类来实现的,Java中的类加载器是一个重要的Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。

     

    补充:

    1.由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2如果类中存在初始化语句,就依次执行这些初始化语句。

    posted @ 2017-10-21 21:05 toov5 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • JVM 知识点

    2021-04-08 18:42:32
    JVM如何跨平台: 不同系统有不同的JVM环境,JRE不同运行时候进行跨平台。 c和c++根据选择的不同类库在编译时跨平台,java在运行时跨平台 JVM分为三大块: 年轻代 由End、S0和S1组成 年老代 持久代(JDK1.8取消了) ...

    JVM如何跨平台:

    • 不同系统有不同的JVM环境,JRE不同运行时候进行跨平台。
    • c和c++根据选择的不同类库在编译时跨平台,java在运行时跨平台

    JVM分为三大块:

    • 年轻代 由End、S0和S1组成
    • 年老代
    • 持久代(JDK1.8取消了)

    年轻代分为三大块:

    当发生年轻代GC(YGC)时End区域的对象被其他对象引用时,则移到幸存者S0、S1区,未引用的立即清除,当S0和S1多次YGC都还存在的话,则移到老年代区域。

    GC分为两大块:

    • minor GC 清理新生代和老年代
    • Full GC 清理整个堆空间

    垃圾回收GC实现:

    • 主要回收算法:
    1. 标记-清除算法
    2. 标记-整理算法
    3. 复制算法
    4. 分代收集算法
    5. 分区收集法(G1)
    • 常用垃圾回收器:
    1. Serial串行收集器(新老年代)
      1. 为单线程环境设计,只能一个线程进行回收;会暂停所有用户线程,不适用多线程环境。
    2. ParNew收集器
      1. Serial的多线程版本
    3. Parallel Scavenge并行收集器
      1. 采用复制算法。多个垃圾收集线程工作,此时用户是暂停的;常用于科学计算、大数据等弱交互场景。关注点在提高系统吞吐量上。
    4. CMS(Concurrent Mark Sweep 并行标记清除)收集器
      1. 不需要暂停用户线程,以牺牲吞吐量来得到GC最短停顿时间,快速响应用户。对CPU的要求比较高,采用标记-清除算法,会产生较多内存碎片。适用对响应时间有要求的公司。
    5. G1(Carbage First)收集器(从JDK1.7 Update 14之后的HotSpot虚拟机正式提供了商用的G1收集器)
      1. G1的出现是打算替代CMS的。将内存分成了许多小空间,对内存小空间有要求1-32M,是一种跨年轻代和旧生代的回收,与以往理解的对内存结构不同。采用标记-整理、分区收集算法,产生碎片空间较少。可设置程序暂停的最大时间。

    CMS和G1相同点:

    1. 都是响应有限,尽可能减少stop the world的时间。
    2. G1和CMS的Full GC都是单线程mark sweep compact(标记-清扫-压缩),直到JDK10才并行的

    JVM底层实现原理:

    1. 类装载子系统
    2. java运行时数据区
    • 堆(heap)
    • 方法区/元空间(method) 常量+静态变量+类信息
    • 栈(stack) 先进后出
    • 本地方法栈(Native Method Stack) native修饰的方法
    • 程序计数器(Program Counter Register)

    堆和方法区为线程共享数据,栈、本地方法栈和程序计数器为线程私有数据。

    1. 执行引擎 cpu操作运行时数据区

    GC执行顺序:

         end区内存满了则触发minor gc回收,将无引用的对象清除,有用的则移动到s0幸存者,s0中对象头中年龄变更为1,下次清理还存在时变更为2。s0的对象age在15次还没回收时将进入老年代。end对象放到幸存者区,对象大于s0幸存者百分之50则直接进入老年代。

    什么是内存溢出oom和内存泄露 ??

    • 内存溢出 项目中创建的对象内存在校大于堆内存剩余大小。
    • 内存泄露 项目中创建的引用,不再被引用使用且存在

    性能调优:

    • 为什么调优?

    有限的空间做更多的事情。设置JVM设置使用内存上限,避免影响系统其它程序。

    • 调优调的是什么?

    性能调优调的是是堆

    • 参数默认值是什么?

    老年代3分之二 新生代三分之一

    新生代8:1:1 end:s0:s1(幸存区)

    s0最大年龄15,4byte最大二进制位1111,对应数字为15。

    • 调优的方向

    要减少stw(stop the world)出现,也就是减少full gc,减少老年代满的次数。因为stw时JVM是不能提供响应的,容易导致用户体验不好。

    1. 避免大的垃圾对象从End区转到S0区,对象超过S0区50%直接放入老年代,增加fullGC次数。调优方法:年轻代和老年代适度分配,并不是年老代越大越好。

    性能调优命令?

    • top 查看占服务器前10的进程
    • jmap 查看内存堆栈信息,可使用dump来进行导出。本地使用 java visualVM 查看分析。
    • jstack 查看CPU使用的线程信息

    如何指定垃圾收集器?

    -XX:UseG1GC,指定GC。算

    jvm可以指定算法吗?

    不能,算法跟着垃圾收集器走

    jdk1.8做了哪些提升?

    • 废弃老年代,将方法区改为元空间
    • 提供了 G1 垃圾收集器

    分析 JVM 神器,有哪些?(部分)

    1. 阿里开源的 arthas ,方便我们查看本地运行的 java 程序的内存使用情况等
    2. Visual VM,方便查看、分析下载的dump内存文件等

    百万订单的网站会有更多的jvm坑,有的学,最好配合实战演练,这样记忆深刻,理解也会透彻些。

     

     

     

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,577
精华内容 2,630
关键字:

jvm知识点