随笔分类 - JVM & JMM
摘要:什么是字节码: Java的使命是一次编译,处处运行。在不同的操作系统、不同的硬件平台上,均可以不用修改代码即可顺畅地执行。 之所以能一次编译,处处运行,有以下原因: 1)把编译的过程分成两部分,首先无论在什么平台它会先由javac编译成通用的固定的中间形式——字节码(.class文件),然后再由解释
阅读全文
摘要:在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充。 另外,Java中对象的内存布局分为两种情况,非数组对象和数组对象,区别是数组对象头中需要额外的空间存储数组的长度length。 对象头(Object Head
阅读全文
摘要:一、自旋锁和自适应自旋锁 自旋锁: 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要操作系统切换CPU从用户态转到核心态中去完成。这些操作给操作系统的并发性能带来了很大的压力。 如果同步代码块中的内容过于简单,状态切换消耗的时间有可能比用户代码执行的时间还要长。 在许多场景中,共
阅读全文
摘要:OutOfMemoryError 除了程序计数器外,其余的几个运行数据区都有可能发生OutOfMemoryError(OOM)的可能。 因此在遇到OOM的问题时应能根据异常的信息快速定位到时哪个内存区域的内存溢出,知道什么样的代码会导致OOM,以及该如何处理。 1、Java堆溢出 Heap堆是OOM
阅读全文
摘要:JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。 JVM运行时数据区: 1、堆 虚拟机中最大的一块内存区域,是线程共享的内存区域,用于存放对象的实例,数组内存在此分配(所有的对象实例和数组都在堆上分配),可能划分出多个线程私有的分配缓冲区(Thread
阅读全文
摘要:Java会对内存进行自动分配与回收管理,使上层业务更加安全,方便地使用内存实现程序逻辑。 垃圾回收的目的是清除不再使用的对象,自动释放内存。 垃圾收集器与内存分配策略 栈的内存随着方法的结束和线程结束自动回收,因此Java堆和方法区是垃圾收集器所关注的内存区域 判断对象是否可以回收 1、 引用计数法
阅读全文
摘要:堆dump文件分析 Java代码: public class HeapTest2 { static class OOMObject { private byte[] arrs = new byte[64 * 1024]; // 会占用64k的堆内存 } public static void fill
阅读全文
摘要:在冯诺依曼定义的计算机模型中,任何程序都需要加载到内存中才能与CPU进行交流。字节码.class文件同样需要加载到内存中,才可以实例化类。 ClassLoader类加载器负责将提前加载.class类文件到内存中,使用双亲委派机制 类加载是一个将.class字节码文件读入内存,并实例化为Class对象
阅读全文
摘要:Java内存模型(Java Memory Model,JMM),Java虚拟机规范中定义的来屏蔽掉各种硬件和操作系统的内存访问差异, 以实现让Java程序在各种平台下都能达到一致的内存访问结果。 happens-before JMM中最为重要的一个概念便是 happens-before 关系。 ha
阅读全文
摘要:JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。 JVM运行时数据区: 1、方法区:类信息(类名,访问修饰符、字段描述、方法 描述等)、常量、静态变量、即时编译后的class文件等。在GC时用永久代来实现方法区 2、运行时常量池:是方法区的一部分,存放
阅读全文
摘要:1、移除方法区 JDK 1.7及之前方法区存放的数据有类信息(类名,修饰符,字段描述,方法描述等),常量,静态变量,即时编译后的class文件。 方法区中还包含有常量池:常量池中主要有字面量和符号引用 字面量:文本字符串,声明为final的常量值; 符号引用:包括了三种常量,分别是:类和接口的全限定
阅读全文