![](https://img-blog.csdnimg.cn/2019092715111047.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM
JVM的一些笔记、实验之类
源大郎
这个作者很懒,什么都没留下…
展开
-
《深入理解JVM》第13章现场安全与锁优化
线程安全当多个线程访问一个对象时,如果可以不考虑线程的调度以及交替执行,也不需要额外的同步手段,或者调用方进行任何其他操作,所得到的结果都是正确,那么就被称为线程安全。如果一个时间段只有一个线程在操作(写操作之类)该对象,那必然也是线程安全的。或者说不影响对象状态的多线程一起操作。(就有点像买东西,大家都能看,但是如果要拆开包装对它进行一些会影响到商品的一些性质之类的,只能“买”下来了)。Java中的线程安全线程安全可以当成一个强弱程度的概念而不用简单当成是或否的概念。不可变不可变基本类型一定原创 2020-05-30 06:19:32 · 137 阅读 · 0 评论 -
《深入理解JVM》第12章Java内存模型与线程【1】线程部分
Java与线程从JVM的角度讲线程线程的实现线程是比进程更轻量级的调度执行单位,它将进程的资源分配与执行调度分开使得各个线程既可以共享进程资源,又可以独立调度,它是目前Java中进行处理器资源调度的基本单位。主要有三种实现方式:1.内核线程实现(1:1实现)2.使用用户线程实现(1:N实现)3.使用用户线程加轻量级进程混合实现(N:M实现)内核线程(1:1)实现(主流JVM采用这种)内核线程是直接由操作系统内核支持的线程 ,由内核来完成线程切换,内核通过操纵调度器对线程进行调度,并负责将任原创 2020-05-28 03:26:19 · 147 阅读 · 0 评论 -
《深入理解JVM》第12章Java内存模型与线程【0】(JMM部分)
概述由于计算机计算能力与它的存储和通信子系统的速度差距过大,所以必须使用一些手段来压榨处理器的运算能力,这个手段之一就是多线程并发。硬件的效率与一致性由于计算速度与IO操作的速度差异了几个数量级,所以不得不为现代计算机系统加入一层或者多层读写速度尽可能接近处理器运算速度的高速缓存。但是由于处理器都共享同一块主存但是彼此之间的高速缓冲是不可见的,这就引发了缓存一致性(可见性)问题。而且为了处理器内部的运算单元可以被充分利用到,处理器可能回对输入代码进行乱序执行来优化(重排序),这就引发了有序性问题。原创 2020-05-27 06:30:34 · 145 阅读 · 0 评论 -
《深入理解JVM》第11章后端编译与优化——提前编译器与后端优化
提前编译器优劣得失由于即时编译不可避免的会占用一些本该属于程序运行的时间。所以这就使得的提前编译有了存在的必要性,不过提前编译就失去了原来的平台性中立性,动态拓展等优势,不过为了性能倒也是值得的(还是得看应用场景)。实现提前编译有两个方向:将程序代码编译成直接机器码存于本地(类似C/C++)。(比如安卓里的ART,不过由于会占使得启动变慢,所以在Android7.0之后重新启用解释器与即时编译器,在系统空闲时后台自动进行提前编译)。把原本即时编译器在运行时要做的编译工作提前做好并保存(即时编译缓原创 2020-05-25 07:02:27 · 212 阅读 · 0 评论 -
《深入理解JVM》第11章后端编译与优化——即时编译器(JIT)
概述所谓后端编译就是指从Class字节码编译为本地机器的二进制码的过程。其中包括了提前编译器(AOT)和即时编译器(JIT).这部分是评判一款虚拟机优秀与否的关键指标之一。即时编译器Java程序最初都是通过解释器执行的,当虚拟机发现某个方法执行得特别频繁时,就认定它们为热点代码,为了提高热点代码的执行速度,就会把他们编译为本地机器码,执行这些操作的就是即时编译器解释器与编译器在主流JVM中,都是解释器与编译器共存的。解释器的优势是:不需要额外执行编译过程就可以立即运行。编译器的作用:它会将原创 2020-05-24 07:06:06 · 276 阅读 · 0 评论 -
《深度理解Java虚拟机》第10章前端编译与优化
概述编译分为:前端编译器:将Java源码编译为Class字节码(javac,ECJ)JIT:运行期将字节码转变为本地机器码(重排序就是此阶段发生的)(C1,C2,Graal)提前编译器:直接将源码编译为与目标机器指令集相关的二进制代码的过程。(jaotc、GCJ、Excelsior JET)这一章是讲第一部分的,这部分编译对于性能基本上没有优化,不过一些语言新特性是靠它实现的,而性能的优化主要是在运行期完成的。Javacjavac是居然是Java写的!!!编译字节码过程大致分为4个过程原创 2020-05-22 05:50:17 · 136 阅读 · 0 评论 -
《深入理解JVM》第八章虚拟机字节码执行引擎(1)栈帧的结构与多态如何实现
这一章主要介绍了栈帧的结构,重载(静态分派),多态(动态分派)的底层原理,JDK7之后类似动态语言的实现。栈帧栈帧是虚拟机运行时数据区里所属于虚拟机栈的组成单元,每调用一个方法就会产生一个栈帧。栈帧又由局部变量表、操作数栈、(动态链接、方法返回地址和一些额外的信息)构成,其中会把()中的仨统称为栈帧信息。操作数栈的深度以及局部变量表的容量都在编译Java代码成Class文件时被写在对应方法的Code属性里了。局部变量表:用于存储方法参数和内部定义的局部变量。使用被称为变量槽的结构存储局部变量,原创 2020-05-19 01:49:45 · 117 阅读 · 0 评论 -
《深入理解JVM》第七章虚拟机类加载机制笔记
不知道大家有没有这种感觉,如果在书中看到一个自己听过却不是很了解的,都会一阵激动。之前就听说过什么双亲委派机制啥的,昨天终于学到了!概述一个类型被加载到卸载会经历这些过程。整个类加载的过程可粗分为三个部分1.加载2.连接3.初始化注意整个加载过程都是在运行期完成的(这也使得了动态加载成为可能,"静态加载"就是指常规通过编译加载的类型,编译就是将Java文件翻译成class文件(字节码,就上一章那些东西,就规范个格式的感觉,这时候还没写入内存呢)。除了解析的发生的时间顺序可能与上图不一样,其原创 2020-05-15 22:12:44 · 94 阅读 · 0 评论 -
《深入理解JVM》第六章类文件结构
JVM的两个目标:平台无关性与语言无关性。平台无关性: 由于有字节码这个中间商,所以可以实现跨平台,实现一次编写到处运行的目的,那么代价是什么呢?成为半编译半解释语言,比同等直接编译的语言略慢不过也能接受。语言无关性: JVM可不止能够运行Java啊,还能跑很多其他的语言,反正大家编译出来的class文件都差不多。JVM本质是执行class字节码,不管啥语言多写个编译器就好了。类文件结构啊这部分太难啃了,我比较倾向于如书中所说读字典的方式。不过它又很重要。所以我只记录我认为信息量比较大的吧(当然不原创 2020-05-11 00:44:46 · 183 阅读 · 0 评论 -
《深入理解JVM》第五章调优案例分析与实战笔记
案例分析总结大内存硬件上的程序部署单体应用在较大内存硬件的部署方式分为两种:通过单独的JVM实例来管理大量堆内存同时使用若干个JVM,建立逻辑集群来利用硬件资源。若采用第一种,那务必注意Full GC…让老年代相对稳定。若采用第二种,资源竞争的问题和大量使用本地缓存的应用,在逻辑集群中会造成较大的内存浪费,可以考虑改为集中式缓存。集群间同步导致的内存溢出//保存内存溢出时的快照...原创 2020-05-06 00:28:42 · 159 阅读 · 0 评论 -
借助jhsdb来看看对象存在于何处以及Integer类型和String类型的缓存机制(详细得一批)
首先贴实验代码,JVM参数设置为:-Xmx10m -XX:+UseSerialGC -XX:-UseCompressedOopspackage test4;public class JHSDB_TestCse { //-Xmx10m -XX:+UseSerialGC -XX:-UseCompressedOops // static class Test{ ...原创 2020-04-30 07:21:28 · 384 阅读 · 0 评论 -
《深入理解JVM》第三章内存分配与回收策略实战
选择合适的垃圾收集器Epsilon收集器:不回收垃圾的收集器,只负责内存的分配。在一些场景下,比如程序只运行较短时间根本不足以将堆占满时就适用这种收集器。垃圾收集器的选择三个方面:需求:低时延,高吞吐还是内存占用小硬件设施是怎样的JDK版本常用参数汇总(-XX:+)参数描述UseSerialGC虚拟机运行在Client模式下的默认值,打开时使Se...原创 2020-04-21 17:25:50 · 151 阅读 · 0 评论 -
《深入理解JVM》第三章垃圾收集器与回收分配策略(低延迟垃圾收集器)
完美的收集器的需要提高三个指标1.内存占用 2.吞吐量 3.延迟不过这仨被称为不可能三角,既然是三角,自然就不可能达成完美咯。不过现今来说,低延迟的重要性日渐凸显。现主要有两款垃圾收集器:Shenandoah(仅用于Open JDK12之后版本)ZCG(Oracle亲儿子)以下大多图都是源自这个PDF下图为各种主流垃圾回收器的并发情况(绿色为并发,黄色为stop the wor...原创 2020-04-20 02:01:51 · 132 阅读 · 1 评论 -
《深入理解JVM》第三章垃圾回收与内存管理(经典垃圾收集器)
经典垃圾回收器的总结大概就如图所示了,CMS和G1细节比较多,就在文章里写好了CMS(Concurrent Mark Sweep):首先它是基于标记-清理算法针对老年代以最短回收停顿时间为目标的并发收集器,主要面向追求响应速度的场景,它基本不用stop the world诶(俺也觉得stop the world这个说法很酷23333)!为啥说基本呢,就是主要的过程不用,那么它的清理过程是怎样...原创 2020-04-18 22:37:06 · 147 阅读 · 0 评论 -
《深入理解Java虚拟机》第三章垃圾收集器与内存分配策略(理论部分)
垃圾收集主要针对的是非栈区域(因为栈区域的内存分配和回收具备固定性,于编译期基本已知,随着方法,线程结束就回收了,所以无需过多关注。)既然是回收垃圾自然是得先判断对象是不是垃圾啊,对象是垃圾的标准就是对象死了,对象是否死亡,有两种判断方式。引用计数法:当有地方引用到它时,计数器+1,引用失效,计数器-1,若计数器为0时,代表对象死了。不过这种方式会引发循环引用问题(就是虽然没有使用了,不过...原创 2020-04-17 22:10:59 · 279 阅读 · 0 评论 -
《深入理解JVM虚拟机》第二章笔记内存区域、对象创建、内存溢出异常
相较于之前看的Java虚拟机规范(JVM内存区域),这本书多了实践内容,感觉看着更带感呢(主要是趁着打折买了新书,喜新厌旧的我).在我上一篇关于内存区域的博客中对内存区域的讲解与这一章的内容都大同小异 (里面有段话,挺好玩的,一些资料称Java堆为GC堆,作者说幸好没翻译为垃圾堆.俺又想到之前网传的一句啥子话,不要在垃圾堆里找对象,对象又都在GC堆里啊,难怪找不到对象(开玩笑的)) .运行时数...原创 2020-04-16 02:08:27 · 340 阅读 · 0 评论 -
《Java虚拟机规范》1.0笔记第二章数据类型、运行时的数据区
数据类型类型大小备注byte8short16int32long64char16指向基于多文本平面的Unicode码点,以UTF-16编码float32double64boolean32由于编译后JVM使用int数据类型来代替它,所以长度为32位,置于为啥用32位不用1位或者更小的byte来代替,是由于...原创 2020-03-31 04:37:13 · 111 阅读 · 0 评论