随笔分类 -  JVM

摘要:1.锁优化 挂起线程和恢复线程的开销较大,对于锁定状态时间较短的情况下,挂起线程并不值得。 遇到锁不会挂起,而是忙循环(自旋)一会儿,避免了一次线程切换的开销,但是仍在占用CPU时间。 1.6默认开启,默认自旋10次。 1.6还引入了自适应自旋锁,他可以根据上一次在同一个锁上的自旋时间调整自旋次数。 阅读全文
posted @ 2018-09-09 17:06 Mibloom 阅读(355) 评论(0) 推荐(0)
摘要:1.执行引擎 所有Java虚拟机的执行引擎都是一致的: 输入的是字节码文件,处理过程就是解析过程,最后输出执行结果。 在整个过程不同的数据在不同的结构中进行处理。 2.栈帧 jvm进行方法调用和方法执行的数据结构,是虚拟机栈的元素。 (图片来自网络) 2.1 局部变量表 存放方法参数和方法内部定义的 阅读全文
posted @ 2018-09-09 12:21 Mibloom 阅读(948) 评论(1) 推荐(0)
摘要:1.类的生命周期 2.初始化被触发的情况 初始化前自然要完成加载、验证、准备这三个动作。 3.类加载过程 类加载全过程分为:加载、验证、准备、解析、初始化这5个阶段所执行的具体操作。 所以不触发初始化就不会进行类加载,懒加载也由此而来。 如 类文件中有个 a.f() 加载时把a放入方法区的常量池中, 阅读全文
posted @ 2018-09-08 20:49 Mibloom 阅读(173) 评论(0) 推荐(0)
摘要:1.内存分配与回收策略 2.对象优先在Eden 分配 Full GC 是整个堆的GC,会清理老年代和新生代。 3.大对象直接进入老年代 4.长期存活的对象进入老年代 5.动态年龄判断。 6.空间分配担保 阅读全文
posted @ 2018-09-08 10:04 Mibloom 阅读(159) 评论(0) 推荐(0)
摘要:1. Serial 新生代收集器 2.ParNew 新生代收集器 3. Parallel Scavenge 新生代收集器 4.Serial Old 老年代收集器 5.Parallel Old 老年代收集器 6.CMS 老年代收集器 7.G1 收集器 8.Remembered Set 阅读全文
posted @ 2018-09-07 20:33 Mibloom 阅读(229) 评论(0) 推荐(0)
摘要:1.垃圾收集 Garbage Collection 程序计数器、虚拟机栈、本地方法栈这三部分内存随着线程生而生,随着线程灭而自然的回收,他们的大小在编译期间就大致确定了下来,所以对这部分的回收是具备确定性的。 Java堆,方法区则不一样,在运行期间会创建对象,对象内存分配和回收都是动态的,所以是不确 阅读全文
posted @ 2018-09-07 16:46 Mibloom 阅读(180) 评论(0) 推荐(0)
摘要:1.Java虚拟机栈 java方法执行时的内存模型 1.1 栈帧 每个方法都会在虚拟机栈中创建一个对应的栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。 一个方法的调用到结束就对应这一个栈帧从虚拟机栈入栈到出栈。 1.2 局部变量表 存放编译期可知在方法中各种基本数据类型和对象的引用, 阅读全文
posted @ 2018-09-07 10:44 Mibloom 阅读(932) 评论(0) 推荐(0)
摘要:1.OutOfMemoryError 抛出异常后先确定是堆溢出还是栈溢出 堆溢出:java.lang.OutOfMemoryError: Java heap space 堆出现OOM(标志就是Java heap space)首先确认是内存溢出还是内存泄漏。常见的OOM就是堆溢出。 内存泄漏: Mem 阅读全文
posted @ 2018-09-06 18:15 Mibloom 阅读(793) 评论(0) 推荐(0)
摘要:1.Java运行时数据区 方法区,堆线程共享。虚拟机栈,本地方法栈和程序计数器线程私有。 2.程序计数器(PC计数器) 占用较小的一块内存空间,当执行Java方法时记录正在执行的虚拟机字节码指令地址,如果执行Native方法则计时器值为空。 3.Java虚拟机栈 java方法执行时的内存模型 查看J 阅读全文
posted @ 2018-06-29 19:44 Mibloom 阅读(1501) 评论(0) 推荐(0)