JVM
文章平均质量分 52
Java虚拟机学习相关感想
加把劲骑士RideOn
求关注,一名Java后端开发
展开
-
堆及新生代老生代(学习笔记)
来自颜群老师的JVM课程小结新生代特点大部分对象都存在新生代新生代的回收频率高,效率高老生代特点空间大,增长速度慢垃圾回收频率低划分新老生代的意义可以根据项目中对象大小的数量,设置新生代或老生代的空间容量,从而提高GC性能什么是堆空间即存放对象实例(数组、对象)堆是JVM区域中最大的一块,在JVM启动时就创建完毕GC主要管理的区域堆本身是线程共享,但在堆内部可以划分出多个线程私有的缓冲区堆允许物理空间不连续,只要逻辑连续即可堆可以分为新生代和老生代,占比为1:2堆.原创 2022-05-16 22:24:43 · 371 阅读 · 0 评论 -
主动使用(类的初始化时机)和被动使用
来自颜群老师的JVM课程类的使用方式1. 类的初始化:JVM只会在“首次主动使用”一个类/接口时,才会初始化它们2. 主动使用(四种方法)new构造类的使用类加载时就自动加载static修饰的变量和代码块,这就是主动使用并且第二次new时不会再次初始化2. 访问类/接口的静态成员跟上一条的一样,static修饰的成员都会在类加载时被初始化3. 反射主动使用反射一共有三个入口:Class.forNam(全类名),类.class,类实例.getClass()其中,只有Class.原创 2022-05-16 22:27:27 · 113 阅读 · 0 评论 -
类的生命周期(学习笔记)
来自颜群老师的JVM课程JDK/JRE/JVMJDK是Java开发环境,开发就用它,但是根据OS不同也会有不同的版本。JRE是Java运行环境,运行java代码就用它JVM是Java虚拟机,在任何OS上都一样,负责接收.class文件,将其转换能够运行的程序。屏蔽OS差异的组件,针对OS的不同底层而设计的组件,用于将生命周期类的加载->连接->初始化->使用->卸载1. 类的加载查找并加载类的二进制文件(.class文件)硬盘上的.class文件被加载.原创 2022-05-16 22:15:57 · 111 阅读 · 0 评论 -
主动使用中静态成员的问题
来自颜群老师的JVM课程静态成员问题final修饰的变量是常量常量产生的时机:时间:编译期间地点:JVM(调用该变量的方法,这里是main方法)方法区中的常量池通过查看StaticTest的.class文件可以发现,在编译后在A中常量的值被调用到main函数中父类子类的调用问题1. 如果num被final修饰,则不会被初始化2. 如果既被final修饰,又被static修饰也通过Random赋值,则又会被初始化3. 如果num的初始化在Son类中也存在,则本次被调用的nu.原创 2022-05-16 22:29:17 · 91 阅读 · 0 评论 -
volatile与重排序问题(学习笔记)
来自颜群老师的JVM课程volatile的作用防止JVM对long/double等64位的 非原子性协议等数据类型 进行的误操作(即读取半个数据)可以使变量对所有线程立即可见(某一个线程如果修改了工作内存中的变量副本,如果该变量副本被volatile修饰,则会立即同步到其他线程的工作内存中)禁止指令的“重排序”优化什么是重排序1. 原子性操作:形如:num = 10; 的操作就是原子性操作非原子性操作:int num = 10; <==> int num; num =.原创 2022-05-16 22:19:19 · 144 阅读 · 0 评论 -
虚引用和引用队列
来自颜群老师的JVM课程虚引用是什么虚引用又称为:幻影引用或幽灵引用在java.lang.ref包下的PhantomReference<T> 类下是否使用虚引用和引用对象本身没有任何关系;无法通过虚引用获取对象本身。软引用和弱引用,get()操作总是能获取引用对象虚引用的get()则被重写成了return null;虚引用的使用虚引用不会单独使用,一般会和引用队列(java.lang.ref.ReferenceQueue)一起使用价值当GC回收一个对象时,如果GC发现.原创 2022-05-17 10:47:08 · 584 阅读 · 0 评论 -
JVM四种引用级别
来自颜群老师的JVM课程引用级别根据引用的强弱关系:强>软>弱>虚各种引用的出处强引用:new软、弱、虚 + 最终引用:java.lang.ref.Reference问题:如果一个对象存在着指向它的引用,是否该对象不会被GC回收?不一定。即便是:Object obj = new Object(); 这样的强引用,也会存在一定的局限性强引用Object obj = new Object();约定:引用==obj,引用对象 == new Object()问题:强引.原创 2022-05-16 22:30:40 · 126 阅读 · 0 评论 -
JVM内存模型(Java Memory Model)(学习笔记)
来自颜群老师的JVM课程JMM用于定义(所有线程的共享变量,不能是局部变量)变量的访问规则JMM将内存划分为两个区:主内存区、工作内存区1. 主内存区真实存放变量。一般情况下线程都将主内存的数据copy到自己的工作内存中,不直接访问主内存区2. 工作内存区主内存中变量的副本,供各个线程使用。每个线程独占一个工作内存,不能串用。线程A如何获取线程B的值线程B将数据同步到主内存,操作名:save线程A从主内存中获取最新数据,操作名:load深入理解线程之间数据交互的原理Lo.原创 2022-05-16 22:18:31 · 110 阅读 · 0 评论 -
volatile与线程安全问题(学习笔记)
来自颜群老师的JVM课程问题:volatile是否保证原子性,保证线程安全?都不能1. 原子性问题:由于volatile概念上就只设计了可见性,而没有原子性。volatile的管理范围只有对变量的原子性操作,除此之外都不负责2. 线程安全问题:由于num++非原子性操作,在JVM中可能出现两个线程num+1,结果都是num+1的情况。使用Atomic类对操作原子性化改进以上代码,使用AtomicInteger对num进行初始化,并调用API IncrementAndGet(1)替代n.原创 2022-05-16 22:20:28 · 247 阅读 · 0 评论 -
虚拟机栈与本地方法栈(学习笔记)
来自颜群老师的JVM课程定义描述方法执行的内存模型虚拟机栈方法在执行的同时,会在虚拟机中创建一个栈帧调用原理纯天然的栈模型,最外层的方法总是最晚被执行完,越是内部的方法越先被执行。栈帧中的内容方法局部变量表:基本数据类型和对象引用类型操作数据栈:栈中又嵌套了栈动态链接参考多态的特性,符号引用会在实际执行时,转化为不同的地址,每执行一次都会发生一次转化方法出口信息方法执行结束以后,需要弹出栈,这里记录的就是方法弹出后的信息以及接下来执行的信息栈溢出ja.原创 2022-05-16 22:23:30 · 659 阅读 · 0 评论 -
JVM运行时区域与程序计数器(学习笔记)
来自颜群老师的JVM课程JVM运行时区域程序计数器行号指示器,指向当前线程锁执行的字节码指令的地址例如:int a = 0; // 1int b = 10; // 2if(a < b){ // 3 … // 4-10}else //11while(){ … }这个行号是根据.class中程序计数器所维护的,理解为class文件中的行号在执行判断、循环部分的时候,程序计数器会根据行号来进行推断下一步该如何执行注意:.原创 2022-05-16 22:22:12 · 152 阅读 · 0 评论