![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 89
od_FLY
这个作者很懒,什么都没留下…
展开
-
JVM角度理解重写和重载
两个概念方法调用:确定被调用方法的版本解析:类加载期间确定,由符号引用转为直接引用,invokestatic(调用静态方法)invokespecial(调用实例构造器init方法、私有方法、父类中的方法)分派:运行期间确定,确定目标方法的直接引用invokevirtual(调用虚方法)invokeinterface(调用接口方法,在运行时确定一个实现该接口的对象)invokedynamic(运行时动态解析出调用点限定符所引用的方法,然后再执行该方法)方法执行:由执行引擎执行此方法解析原创 2022-03-23 06:47:10 · 207 阅读 · 0 评论 -
Java内存模型与线程
多线程的出现计算机的运算能力太强大了,它的运算速度和它的通信子系统的速度差距太大,大部分时间都花费在磁盘IO、网络通信或者访问数据库上。为了避免这部分浪费,将IO等待的时间利用起来,就必须采用多线程的方案。硬件的效率与一致性由于计算机的存储设备与处理器的运算速度有着几个数量级的差距,所以现代计算机系统都不得不加入一层或多层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要使用的数据复制到缓存中,让运算能快速地进行,当运算结束后能再从缓存同步回内存之中,这样原创 2022-03-17 15:45:21 · 228 阅读 · 0 评论 -
Java运行时数据区域
运行时数据区域程序计数器(与解释器配合工作)程序计数器是一块较小的内存空间,可以看做是当前线程所执行字节码的行号显示器。在Java虚拟机的概念模型中,字节码解释器工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,包括分支循环跳转异常处理等基本功能如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址如果线程正在执行的是一个本地(Native)方法,这个计数器的值则应该为空(Undefined)此内存区域永远不会出现OOM原创 2022-03-17 15:29:41 · 984 阅读 · 0 评论 -
Java对象的创建及布局
对象的创建在Java虚拟机中当遇到一条字节码的new指令时1.检查类是否被加载首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有,那就必须先执行相应的类加载过程。2.分配内存空间在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配内存空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来(空间分配管理有以下两种算法 1.指针碰撞法 2.空闲原创 2022-03-17 15:28:57 · 777 阅读 · 0 评论 -
JVM角度的线程安全以及JDK6之后Synchronized部分优化
线程安全当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。Java语言中的线程安全各种操作共享的数据可以按照安全程度由强到弱分为以下五类不可变:只要一个不可变的对象被正确的构建出来,那其外部的可见状态都永远不会改变,如String绝对线程安全Java API中标注自己是线程安全的类,大多数也都不是绝对的线程安全相对线程安全相对线程原创 2022-03-15 13:00:49 · 495 阅读 · 0 评论 -
Java垃圾回收机制
哪些内存需要回收程序计数器、虚拟机栈、本地方法栈三个区域随线程生而生,随线程死而死。而且每一个栈桢中分配多少内存基本上是在类结构确定下来的时候就已知的,当方法结束或线程结束内存自然而然就回收了而堆和方法区这两个区域则有着很显著的不确定性一个接口的多个实现类需要的内存可能会不一样一个方法所执行的不同条件分支所需要的内存也可能不一样只有处于运行期间,我们才能知道程序究竟会创建哪些对象,创建多少个对象,这部分内存的分配和回收是动态的。垃圾收集器所关注的也正是这部分内存应该如何管理是否回收方法区方原创 2022-03-14 23:31:18 · 809 阅读 · 0 评论