JVM深入理解
Hammond_
这个作者很懒,什么都没留下…
展开
-
内存屏障和volatile
内存屏障存在的原因:为了提高CPU的IO速度,除了主存以外设有高速缓存,CPU读取和写入的时候不能够获取到“最新的信息”(与主存交互),而多线程模式下方法区和堆中的变量有可能缓存从而导致“”脏数据“内存屏障作用:阻止屏障两边reOrder强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效对于Load Barrier(读屏障):在指令前加入的话,会强制从主存中读...原创 2020-01-15 22:16:20 · 242 阅读 · 0 评论 -
逃逸分析
逃逸分析是JIT即时编译器中的一个重要的优化手段,动态的编译热点代码并进行逃逸分析,标量替换,锁消除优化代码,JDK1.8默认全部开启逃逸分析:分析对象动态的作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸public static StringBuffer createStringBuffer1(String s1, String ...原创 2020-01-15 22:17:27 · 135 阅读 · 0 评论 -
反射机制
反射就是把java类中的各种成分映射成一个个的Java对象一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。每一个对象都只有一个Class对象存放对象类的一些信息,多的只是对象空间下面来点实例:1、获取class对象的三种方法obj.getClass()obj.classClass.forName(“obj”)...原创 2020-01-15 22:17:16 · 125 阅读 · 0 评论 -
类加载机制
类加载机制:JVM将class文件读取进内存,进行加载-验证-准备-解析-初始化-使用的一系列生命周期过程,将class文件解析成可被JVM识别的Java类型,不用的时候就卸载对应的class对象1、加载“加载”是“类加载”(Class Loading)过程的一个阶段。在加载阶段,虚拟机需要完成以下3件事情:1)通过一个类的全限定名来获取定义此类的二进制字节流。2)将这个字节流所...原创 2020-01-15 22:09:38 · 254 阅读 · 0 评论 -
类加载器
类加载器类加载器负责加载所有的类,其为所有被载入内存中的类生成一个java.lang.Class实例对象。一旦一个类被加载如JVM中,同一个类就不会被再次载入了。正如一个对象有一个唯一的标识一样,一个载入JVM的类也有一个唯一的标识。在Java中,一个类用其全限定类名(包括包名和类名)作为标识;但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。例如,如果在pg的包中有一个名为Pers...原创 2020-01-15 22:18:51 · 512 阅读 · 0 评论 -
强软弱虚,用到的场景
强引用内存不足时,垃圾回收器也绝不会回收具有强引用的对象,然后内存溢出并报错OOM经典的强引用Object oj=new Object();这时不管Object对象是否被使用,垃圾回收器永远都不会回收这个强引用所指向在堆中的Object对象,以防内存不足时造成的困扰,我们可以将它设置为nulloj=null;//变成弱引用方便GC算法查找未被使用的对象软引用内存不...原创 2020-01-15 22:18:42 · 221 阅读 · 0 评论 -
JVM内存模型
JVM逻辑分区主要分为5个主要的模块线程私有:本地方法栈,程序计数器,虚拟机栈线程共享:堆,方法区程序计数器:很小的一部分空间,给每一个线程单独分配的行指示器,唯一一个不会OOM的内存空间由于多个cpu与主存交互时会有多个cpu私有的高速cache,因为只有一个主存,所以需要一个内存屏障(读写锁)来管理这些高速缓存,那么写的时候有可能会有线程切换的情况,这时候程序计数器就能记录切换之前...原创 2020-01-15 22:18:31 · 118 阅读 · 0 评论 -
分代回收算法
Java中所有在堆中的新建的对象都需要经历garbage collect过程1、新生代新建的对象此时此刻还是一个初出茅庐的小伙子,踏进堆中发现一个8:1:1的空间,最大的空间我们把它叫做Eden,两个小的空间我们都叫Survice,他发现这里的垃圾是这样回收的这就是标记复制算法2、年老代经历过多次标记复制还存活下来的对象,由于一个Survice区已经容不下这么对象了,所以把它们放到年...原创 2020-01-15 22:18:31 · 750 阅读 · 0 评论