![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
y&m
这个作者很懒,什么都没留下…
展开
-
(转载)一个线程OOM,一个进程里其他线程还能正常运行吗
引言这题出自今年校招美团三面的一个真题。大致如下一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么?先说一下答案,答案是还能运行不瞒大家说,真在面试中,我遇到这一题,我估计也是答错。因为我初看到这一题,内心嘿嘿一笑,觉得这题是在考察JVM的内存结构。我第一反应是OOM的常见情况堆溢出,也就是下面的这种异常java.lang.OutOfMemoryError: Java heap space先回忆一下,多线程中栈与堆是公有的还是私有的?回答如下java在多线程环境下,每个线转载 2021-05-07 13:50:22 · 306 阅读 · 0 评论 -
volatile关键字
简介volatile关键字保证了在多线程环境下,被修饰的变量在修改后会马上同步到主存,这样该线程对这个变量的修改就是对所有其他线程可见的,其他线程能够马上读到这个修改后的值。说明使用volatile之后,做了如下事情:1、每次修改volatile变量会立即同步到主存;2、每次读取volatile变量的值都强制从主存读取最新的值(强制JVM不可优化volatile变量,如JVM优化后变量读取会使用CPU缓存,而不从主存中读取);3、线程A写入volatile变量之前可见的变量,在线程B中读取该vo原创 2021-05-06 13:46:53 · 58 阅读 · 0 评论 -
Java虚拟机即时编译
从Java8开始,Java虚拟机默认采用分层编译方式。它将执行分为5个层次,分别为0层解释执行,1层执行没有profiling的C1代码,2层执行部分profiling的C1代码,3层执行全部profiling的C1代码和4层执行C2代码。通常情况下,方法会首先被解释执行,然后被3层的C1编译,最后被4层的C2编译。即时编译是有方法调用计数器和循环回边计数器触发的。在使用分层编译的情况下,触发编译的阈值是根据当前待编译的方法数目动态调整的。OSR是一种能够在非方法入口处进行解释执行和编译后代码之间切换原创 2021-05-06 11:44:10 · 105 阅读 · 0 评论 -
happens-before原则
原创 2021-04-13 15:18:52 · 73 阅读 · 0 评论 -
Object o = new Object()占用多少个字节
对象的内存布局在java中对象的内存布局分为两种情况,非数组对象和数组对象。数组对象和非数组对象的区别就是需要额外的空间来存储数组长度length。对象头对象头又分为Mark Down和Class Pointer两部分。Mark Down:包含一系列的标记位,比如轻量级锁的标记位,偏向锁标记位,gc记录信息等等,在32位系统占4字节,在64位系统占8字节。Class Pointer:用来指向对象对应的class对象(其对应的元数据对象)的内存地址。在32位系统占4字节,在64位系统占8字节。.翻译 2021-02-24 10:59:27 · 577 阅读 · 0 评论 -
JVM内存模型
原创 2019-08-20 16:01:57 · 58 阅读 · 0 评论