
JVM
文章平均质量分 91
爱学习的小白_
小白学习中······
展开
-
本人目前学习的所有编程知识
知识总结,不定时更新https://github.com/liulingjie888/code原创 2020-05-19 02:49:46 · 242 阅读 · 0 评论 -
JVM--线程安全与锁优化--大致总结
我们可以将Java语言中各种操作共享数据分为五类:不可变、绝对线程安全、相对县城安全、线程兼容和线程相对。不可变:一个不可变的对象被正确的构建出来(即this引用没有发生逃逸),且保证对象的行为不会对其状态产生影响。绝对线程安全:不管运行环境如何,调用者读不需要任何额外的同步操作。相对线程安全:如java中的线程安全类,但也并不能说明一定是安全的。线程兼容:指对象本身并不是线程安全的,通过同步可以保证安全。线程对立:无法使用并发的代码,如Thread类的suspend和resume方法。线程安原创 2020-08-29 03:55:11 · 176 阅读 · 0 评论 -
JVM--Java内存模型与线程 --大致总结(二)
Java与线程实现线程主要有三种方式:使用内核线程实现(1:1),使用用户线程实现(1:N),使用用户线程家加轻量级进程混合实现(N:M)。1.内核线程内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。程序一般不会直接使用内核县城,而是使用内核线程的一种高级接口--轻量级进程,就是我们通常意义上的线程。由于每个轻量级进程都由一个内核线程支持,因此只有支持内核线程,才能有轻量级进程。它们的关系为1:1。轻原创 2020-08-27 03:41:21 · 171 阅读 · 0 评论 -
JVM--Java内存模型与线程 --大致总结(一)
Java内存模式java内存模型规定了所有的变量都存储在主内存中。每条线程都有自己的工作内存,线程的工作内存中保存了被该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的数据。不同的线程也无法直接访问对方工作内存的变量,线程间的变量值传递均需要通过主内存来完成。为了解决缓存不一致性问题,通常来说有以下2种解决方法:1)通过在总线加LOCK#锁的方式2)通过缓存一致性协议java内存模型中定义了一下8中操作,每一种操作都是原子的、不可再分的。原创 2020-08-26 04:08:58 · 243 阅读 · 0 评论 -
JVM--后端编译与优化--大致总结
如果我们把字节码看作是程序语言的一种中间表示形式的话,那编译器无论在何时、何种状态下把Class文件转换成与本地基础设施相关的二进制机器码,都可以视为整个编译过程的后端。即时编译器目前主流的java虚拟机内部都同时包含解释器与编译器。当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即运行。当程序启动后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码,这样可以减少解释器的中间损耗,获得更高的执行效率。 解释器与编译器经常是相辅相成地配合工作。解释器还可以原创 2020-08-21 01:17:01 · 292 阅读 · 0 评论 -
JVM--前端编译与优化--大致总结
编译器分类前端编译器:javac之类,将java代码编译成字节码即时编译器:Hotspot的C1、C2等,运行期间把字节码编译成本地代码提前编译器:直接把java代码编译成字节码。javac编译过程(1)准备过程:初始化插入式注解处理器(2)解析与填充符号表过程。包括:词法解析:将源码中的字符流转换为标记集合的过程。 语法解析:根据标记序列构造出抽象语法树的过程,它的每个节点都代表一个语法结构。 填充符号表:符号表是由一组符号地址和符号信息构成的数据结构,它所登记的内容用于语义检查原创 2020-08-18 02:25:30 · 222 阅读 · 0 评论 -
JVM--虚拟机字节码执行引擎--大致总结
执行引擎在执行字节码的时候,通常会有解释执行(通过解释器执行)和编译执行(通过即时编译器编译成本地代码)public statci void main(String[] args){ { byte[] placeholder=new byte[64*1024×1024]; } System.gc();} 该代码调用gc后并没有回收placeholder的内存,原因是离开它的作用域后并没有发生对局部变量表的读写操作,变量槽还没有被其他变量复用,所以作为GC原创 2020-08-13 00:54:59 · 224 阅读 · 0 评论 -
JVM--虚拟机类加载机制--大致总结
类加载的生命周期:1.加载2.验证3.准备4.解析5.初始化6.使用7.卸载解析也可能在初始化之后进行,每个阶段通常都是交叉混合进行。对类初始化(主动引用)的6种情况:1.遇到new,getstatic,putstatic和invokestatic这4条字节码指令时,能生成这4条指令代码场景有:使用new实例化对象。 读取或设置一个类型的静态字段(非final)。 调用一个类型的静态方法。2.当类初始化,其父类未初始化时,会先将其父类初始化。3.当实现了默认方法(defau原创 2020-08-03 17:02:19 · 159 阅读 · 0 评论 -
JVM--垃圾收集器与内存分配策略--大致总结
以下是《深入学习java虚拟机》总结判断对象是否还存活?1.引用计数器算法在对象在添加一个引用计时器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器减1。缺点:两个对象内部相互引用了对方,当这两个对象的外部引用失效且内部引用还在引用,这是也会被判断这两个对象已死去。2.可达性分析算法从GC Roots的根对象为起始节点,根据引用关系向下搜索,如果过能够到达一个对象,则说明该对象存活;反之无法到达则说明该对象死去。要真正宣告一个对象的死亡,至少要经过两次标记:第一次发现对象没有原创 2020-07-24 13:37:35 · 180 阅读 · 0 评论