jvm
文章平均质量分 83
悠哉iky
计算机科学与技术|Java后端学习者
展开
-
Java jvm虚拟机对象引用类型、finalize 的理解
他跳到了另一个类型Finalizer,因为构造没有执行完,成员变量也没有赋值,他传给register方法,将dog对象包装成Finalizer对象,这个对象和上面讲的虚引用和弱引用是类似的,配合一个队列到时候跟踪垃圾回收的过程。创建一个引用队列,再创建一个集合,集合里面放了三个MyResource对象,主动调用垃圾回收函数,他会将abc字符串对象回收,同时将虚引用对象加入到队列,再遍历队列看里面的元素是不是虚引用对象,如果是清理。第四,如果将 finalize 中的代码出现异常,会发现根本没有异常输出。原创 2022-10-21 17:07:01 · 445 阅读 · 0 评论 -
Java jvm虚拟机类加载过程(深度且详细)、双亲委派
那为什么访问cm不会触发类的加载和初始化,我们通过看编译器如何使用cm,可以看出他没用使用到student,因为这两个变量都是final static修饰的基本类型,使用这些变量的类会将值进行一个复制,复制到自己的类,根本不需要其他类。我们通过代码改造,类对象非常多,不好找,那就限制了TestLazy对象个数,只有一个,找到他,他的成员变量就是我们所要找的类变量。根据调试工具,cm不会触发类的加载,而引用类型n的访问触发类的加载和初始化。假设你自己的类加载器不用双亲委派,那么你的类加载器加载假冒的。原创 2022-10-20 19:40:34 · 452 阅读 · 0 评论 -
Java jvm虚拟机内存溢出
一、误用线程池导致的内存溢出1、误用固定大小线程池模拟一个短信发送的场景,创建了一个固定大小的线程池,有两个核心线程,循环不断创建线程,输出send sms,模拟了一个发送超时场景因为提交超时,所以剩余任务进入了线程池,导致内存溢出我们再看看newFixedThreadPool的源码,里面的LinkedBlockingQueue是一个无边界的队列,把握不好容易内存溢出。所以建议大家使用的时候创建一个有限制的任务队列。2、误用带缓存线程池。原创 2022-10-20 17:38:57 · 1092 阅读 · 0 评论 -
JVM垃圾回收算法、GC和分代回收、三色标记并发漏标、垃圾回收器
如问题中的黑色即为被复制对象会被记录,垃圾回收线程会监控所有赋值动作,一旦出现赋值就会被记录,换句话说黑色对象变成灰色的,等标记做完,让用户线程先不要运行,再做一次标记,这一遍处理就叫重新标记,这就是增量更新。他讲内存分为两个区域from和to,刚开始to区域是空白的,他第一个阶段也是标记root对象,但是他没有清除的动作,他讲root对象的内容复制到to区域,复制完成后,他会将from区域全部清空,这时候to区域用于存对象,from是空闲区域。清除阶段比较简单,加标记的对象保留,没有标记对象清空。原创 2022-10-19 20:49:29 · 384 阅读 · 0 评论 -
JVM内存结构和内存参数
Cpu只能识别机器码,执行引擎的解释器就是将字节码转换成机器码,如果一个对象调用两次方法,则解释器会执行两次,如果有频繁使用的代码,即时编译器就会将其缓存起来,他就不会去解释,直接在缓冲里面找,交给cpu执行。在此之前,还有一个Main方法没有加载,虚拟机发现一个本身没有的类,就会触发类加载子系统,将类的原始信息加载到Method Area方法区,原始信息包括类名,类继承关系,类的成员变量,类里面引用其他类的名字,类的方法代码。元空间内存没有上线,物理内存多大他就多大,如果你设置了,就是设置值。原创 2022-10-18 15:56:02 · 273 阅读 · 0 评论