java虚拟机
小炫剑指大厂
主要为应届生提供校招或者实习的经验,以及技术博文。
欢迎关注公众号:小炫剑指大厂
展开
-
双亲委派模型破坏
双亲委派当一个类加载器去加载类时先尝试让父类加载器去加载,如果父类加载器加载不了再尝试自身加载。这也是我们在自定义ClassLoader时java官方建议遵守的约定。双亲委派模型能保证基础类仅加载一次,不会让jvm中存在重名的类。比如String.class,每次加载都委托给父加载器,最终都是BootstrapClassLoader,都保证java核心类都是BootstrapClassLoader加载的,保证了java的安全与稳定性。自己实现ClassLoader时只需要继承ClassLoade原创 2020-07-04 17:47:31 · 791 阅读 · 0 评论 -
java虚拟机(十)synchronized是如何实现可见性和有序性的,和volatile的区别
大家都知道 synchronized 是锁。那怎么会实现可见性和有序性。volatile也能实现对吧。java内存模型是这么规定的关于主内存与工作内存之间的交互协议,即一个变量如何从主内存拷贝到工作内存。如何从工作内存同步到主内存中的实现细节。java内存模型定义了8种操作来完成。这8种操作每一种都是原子操作。8种操作如下:lock(锁定):作用于主内存,它把一个变量标记为一条线程独占...原创 2019-08-12 11:22:14 · 3558 阅读 · 5 评论 -
java虚拟机(九)编译是如何优化代码的
首先我们要明白优化代码,并不是建立在java的源码之上的。而是建立在代码的中间表达是或者机器码上面。公共子表达式消除如果一个表达式E已经出现过了。而且下面出现的E的所有变量值都没有发生改变,那就可以优化。如 a=b*c+r+c*b这里b*c和c*b是一样的。所以可以变成 a=e+r+e数组边界检查消除我们知道java是一门动态安全的语言。访问数组的时候,会进行上下界限的检...原创 2019-08-09 20:19:36 · 5927 阅读 · 0 评论 -
java虚拟机(八)语法糖
语法糖可以看成是编译器实现的一些功能。他们帮我们程序员特高代码开发效率。如泛型:泛型擦除前public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("hello", "你好"); map.put("ho...原创 2019-08-09 10:05:19 · 1605 阅读 · 0 评论 -
java虚拟机(四)双亲委派模型
双亲委派模型是在实现在类加载器之间的。一般有三种类加载器 启动类加载器 扩展类加载器 应用程序加载器。 在没有自己定义的类加载器出现 我们的应用程序是由这三种类加载器相互配合的。从名字可以看出 启动类加载器是最顶层的 应用程序是底层的那么该模型的工作过程就是,如果一个类加载器收到了类加载的请求,他不会自己去尝试加载这个类,而是把请求传递给父类,父类再传递 。 如果最...原创 2019-07-26 16:27:06 · 1564 阅读 · 0 评论 -
java虚拟机(七)静态分派与动态分派
通过分派的讲解可以知道java中重载和重写在java虚拟机中是如何是实现的。静态分派package org.fenixsoft.polymorphic;/** * 方法静态分派演示 * @author zzm */public class StaticDispatch { static abstract class Human { } static class Ma...原创 2019-08-02 16:40:24 · 1622 阅读 · 0 评论 -
java虚拟机(六)局部变量表
局部变量表示一组变量值储存空间,用于存放方法参数和方法内部定义的局部变量。其最小单位为solt。一个slot可以存放一个boolean,byte,char,short,int,float,reference,returnAddress,的数据类型。但虚拟机规范确有没有明确规定一个solt占有的空间大小。此外 long,double占用两个solt。因为连续占用两个solt,却不用担心数据安...原创 2019-07-29 11:32:11 · 2011 阅读 · 0 评论 -
java虚拟机(二)对象如何创建的
创建对象,如反序列化、克隆。其实就是new的过程。1.检查既然要创建,那类必须要先实例化。查找类是否实例化的过程就是在虚拟机找该类是否被加载。(其实类一旦被加载,就会执行静态方法)2.为新生对象分配内存分配的方式有两种,指针碰撞,空闲列表。指针碰撞就是把内存分成两边,一边是被分配内存的空间,一边是空闲的空间。指针就来指向这两边的中间,一旦创建了新对象分配内存,指针就往空闲的那边...原创 2019-06-10 11:03:08 · 1610 阅读 · 0 评论 -
java虚拟机(一)对象分代年龄
有个面试官问过一个问题,为什么对象分代年龄有15而没有16,17.因为储存对象分代年龄的只有四位。那当然最多就只有15.来看下图。每个对象刚刚新建就在新生代堆当中。(除了一些较大的对象,要分配很大的连续的内存空间,就直接进入到老年代)这时候,垃圾回收机制就起作用了,当一个对象判定为死亡的时候,垃圾回收就会来处理,经过一轮,新生代就复制到另外的内存空间,他的新生代的值也会相...原创 2019-06-09 14:30:29 · 3568 阅读 · 5 评论 -
java虚拟机(三)空间分配担保
在发生minorGC(对新生代垃圾回收),如果老年代最大可用的连续空间大于新生代所有对象的总空间,那么Minor GC就是安全的。新生代使用复制收集算法,会使用一个survivor空间作为轮换备份。但是如果出现,minor gc 后仍然有很多对象存活,且大于survivor的空间,那么就把无法容纳的放进老年代。放进的同时要做分配担保,就是老年代本身还有容纳这些对象的剩余空间。但是会有多少对...原创 2019-06-14 11:09:42 · 1853 阅读 · 0 评论