![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM学习笔记
翁正存
做一名合格的工程师
展开
-
直接内存溢出
JVM虚拟机是运行在操作系统上的进程,操作系统分配给JVM的内存在启动是有限的,不可能把全部内存都分配给JVM,Java NIO又用到了直接内存技术,利用Channel和Buffer直接操作JVM外的内存,避免数据在JVM和操作系统内存之间来回复制。但是,当JVM和直接内存的和大于操作系统总内存时,就会发生内存溢出。...原创 2018-10-19 11:24:17 · 640 阅读 · 0 评论 -
JVM实践-类初始化
只有主动引用可以触发类的初始化,被动引用不能触发类的初始化。有以下5种主动引用: 1.遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果没有进行初始化,会触发初始化。 2.使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行初始化,则需触发初始化。 3.当初始化一个类时,如果发现其父类还没有进行初始化,则需先触...翻译 2018-10-25 21:38:44 · 110 阅读 · 0 评论 -
类加载器
public class ClassLoaderTest { public static void main(String[] args) throws Exception{ ClassLoader myLoader = new ClassLoader(){ @Override public Class<?> ...翻译 2018-10-29 11:31:52 · 85 阅读 · 0 评论 -
硬件效率与缓存一致性
绝大多数的计算任务都不可能只靠处理器计算就能完成,处理器至少要跟内存交互,如读取运算数据、存储运算结果等,这个I/O是很难消除的,无法仅靠寄存器来完成所有的计算任务。由于计算机存储设备与处理器的运算速度有个数量级的差距(即便存储设备使用SSD,还是比处理器慢几个数量级),所以计算机系统不得不增加一层读写速度尽可能接近处理器速度的高速缓存Cache来作为内存和处理器之间的缓冲:将运算需要使用到的...翻译 2018-10-31 16:47:37 · 245 阅读 · 0 评论 -
JMM内存交互模型
JMM的主要目标就是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量指线程间共享的变量,包括实例字段、静态字段和构成数组对象的元素,存储在主内存中。 每个线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量主内存的副本拷贝(JVM只会拷贝对象的引用和线程中访问到的字段,而不会把整个对象都从主内存拷贝到工作线程),线程对变量的操作...原创 2018-10-31 17:53:15 · 277 阅读 · 0 评论 -
原子性、可见性、有序性
原子性:由JMM直接保证的原子性变量操作是read、load、assign、use、store和write,大致可以认为基本数据类型的读写都是原子性的操作(大多数商用虚拟机将long和double的读写作为原子性操作来对待),对于更大范围的原子性保证,JMM提供了monitorenter和monitorexit操作,对应Java代码中就是synchronized关键字。 可见性:可见性是指当一个...转载 2018-10-31 20:41:16 · 228 阅读 · 0 评论 -
类加载模型-双亲委派模型
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此,所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。 使用双亲委派模型来组织加载器之间的关系,会使Java类随着它的类加载器一起具备了一种带有...翻译 2018-10-30 10:46:14 · 134 阅读 · 0 评论