
JVM
文章平均质量分 59
忧伤的比目鱼
这个作者很懒,什么都没留下…
展开
-
JVM注解@CallSensitive
JVM注解@CallSensitive@CallSensitive是JVM中专用的注解,在类加载过过程中是可以常常看到这个注解的身影的,@CallSensitive用来找到真正发起反射请求的类@CallSensitive的使用@CallerSensitivepublic static Class<?> forName(String className)throws ...原创 2018-04-18 23:52:51 · 668 阅读 · 0 评论 -
JVM -- 程序计数器(Program Counter Register)
程序计数器(Program Counter Register)定义:程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码行号指示器,也可称之为PC寄存器;字节码解释器工作时通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成特性在任何确定的时刻,一个处理器(对于多核处理器是一个内核)都只会执行一条...原创 2018-09-07 23:19:02 · 1415 阅读 · 0 评论 -
JVM相关知识总结
本文主要是关于JVM相关知识的总结,大纲: Summary * 前言 * 概述 * JVM运行时数据区 * 程序计数器 * JAVA虚拟机栈 * 栈帧 * 局部变量表 * 操作数栈 * 本地方法栈 * 堆-Heap * 方法区(Method Area) * 运行...原创 2018-08-22 22:37:44 · 374 阅读 · 0 评论 -
synchronized和Lock的区别
Lock以及它的一个实现类ReentrantLock是jdk5新增加的, Lock也可以用于实现多线程的同步区别synchronized既可以加在方法上,也可以加载特定代码块上,而lock需要显示地指定起始位置和终止位置;synchronized是托管给JVM执行(底层使用mutex lock实现),lock的锁定是通过代码实现的,它有比synchronized更精确的线程语义;sy...原创 2018-06-10 15:15:02 · 1493 阅读 · 0 评论 -
Java类的初始化
平常在写代码的过程中,一般不会注意到类的初始化过程,如果类中有代码块,静态域时,初始化的顺序是怎么样的? 先上代码:public class Application { public static void main(String[] args) { Student stu = new Student(); }}class Person { ...原创 2018-06-08 18:56:17 · 335 阅读 · 0 评论 -
JUC五种常见同步工具类总结
JUC常用工具类SemaphoreCountDownLatchCyclicBarrierExchangerPhaser使用场景这五种同步辅助类适用于的同步场景:Semaphore 信号量是一类经典的同步工具。信号量通常用来限制线程可以同时访问的(物理或逻辑)资源数量。CountDownLatch 一种非常简单、但很常用的同步辅助类。其作用是在完成一组正在其他线程中执...原创 2018-06-09 19:46:10 · 5993 阅读 · 0 评论 -
java notify和notifyAll的区别
notify和notifyAll的最主要的区别notify只是唤醒一个正在wait当前对象锁的线程,而notifyAll唤醒所有。值得注意的是:notify是本地方法,具体唤醒哪一个线程由虚拟机控制;如果有多个线程等待,则线程规划器任意挑选出其中一个wait()状态的线程来发出通知调用notify和notifyAll方法后,当前线程并不会立即放弃锁的持有权,而必须要等待当前同步代码块执行...原创 2018-06-09 19:39:04 · 450 阅读 · 0 评论 -
Synchronzied底层实现
synchronized的底层是使用操作系统的mutex lock实现;Mutex Lock监视器锁(Monitor)本质是依赖于底层操作系统的Mutex Lock(互斥锁)来实现的。每个对象都对应于一个可称为” 互斥锁” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象; 互斥锁:用于保护临界区,确保同一时间只有一个线程访问数据。对共享资源的访问,先对互斥量进行加锁,如...原创 2018-06-09 17:03:27 · 415 阅读 · 0 评论 -
JVM内存溢出和内存泄露
定义内存溢出out of memory:指程序运行过程中无法申请到足够的内存而导致的一种错误;内存泄露memory leak:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收始终占用内存;即被分配的对象可达但已无用内存溢出:堆内存溢出(outOfMemoryError:java heap space)方法区内存溢出(outOfMemoryError:permg...原创 2018-06-13 16:40:00 · 732 阅读 · 0 评论 -
JVM经典书籍
JVM系列学习JVM的相关资料 - 《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》 基于最新JDK1.7,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行全面而深入的分析,深刻揭示JVM的工作原理。以实践为导向,通过大量与实际生产环境相结合的案例展示了解决各种常见JVM问题的技巧和实践《揭秘Java虚拟机:JVM设计原理与实现》 ...原创 2018-05-23 22:07:47 · 34064 阅读 · 3 评论 -
JAVA内存模型--指令重排序
指令重排序在执行程序时,为了提高性能,编译器和处理器会对指令做重排序。但是,JMM确保在不同的编译器和不同的处理器平台之上,通过插入特定类型的Memory Barrier来禁止特定类型的编译器重排序和处理器重排序,为上层提供一致的内存可见性保证。编译器优化重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。指令级并行的重排序:现代处理器采用了指令级并行技术(Ins...原创 2018-05-08 00:07:16 · 299 阅读 · 0 评论 -
JVM内存屏障(Memory Barrier)
#内存屏障(Memory Barrier)内存屏障可以禁止特定类型处理器的重排序,从而让程序按我们预想的流程去执行。内存屏障,又称内存栅栏,是一个CPU指令,基本上它是一条这样的指令:保证特定操作的执行顺序。影响某些数据(或则是某条指令的执行结果)的内存可见性。编译器和CPU能够重排序指令,保证最终相同的结果,尝试优化性能。插入一条Memory Barrier会告诉编译器...原创 2018-05-08 00:01:32 · 5149 阅读 · 0 评论 -
JAVA之long和double读写操作原子性
Java虚拟机规范定义的许多规则中的一条:所有对基本类型的操作除了某些对long类型和double类型的操作之外,都是原子级的; 当线程把主存中的 long/double类型的值读到线程内存中时,可能是两次32位值的写操作,显而易见,如果几个线程同时操作,那么就可能会出现高低2个32位值出错的情况发生。即long,double高低位问题,非线程安全举例说明:即如有一个long类型...原创 2018-05-10 23:43:36 · 3680 阅读 · 0 评论 -
JVM--运行时数据区(JAVA内存结构)
JVM运行时数据区(JAVA内存结构)以前一直对JVM内存结构不是很清楚,最近深入学习后为加深影响参考网上相关的资料整理了JVM的内存结构图JVM被分为三个主要的子系统:类加载器子系统运行时数据区执行引擎 控制参数-Xms设置堆的最小空间大小;默认物理内存 1/64-Xmx设置堆的最大空间大小;默认物理内存 1/4-XX:NewSize设置新生代最小空间大小-...原创 2018-04-20 22:50:08 · 284 阅读 · 0 评论 -
JVM--Native Method Stack(本地方法栈)
Native Method Stack(本地方法栈)定义:本地方法栈为虚拟机使用到的Native方法服务,虚拟机规范未对本地方法栈中方法使用的语义、使用方式与数据结构进行强制规定,因此具体的虚拟机可以自由实现特性线程私有后进先出(LIFO)栈作用是支撑Native方法的调用、执行和退出可能出现OutOfMemoryError异常和StackOverflowError异常注...原创 2018-09-07 23:21:10 · 1172 阅读 · 0 评论