![](https://img-blog.csdnimg.cn/20191216160616937.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM
java虚拟机
软件求生
这个作者很懒,什么都没留下…
展开
-
JVM:常用参数含义。
JVM:常用参数含义。转载 2020-06-12 10:23:59 · 467 阅读 · 0 评论 -
JVM:预热。
一旦类加载完成,所有重要的类(在进程启动时使用)都会被推送到JVM缓存(本机代码)中,这使得它们在运行时可以更快地访问。其他类是根据每个请求加载的。对Java Web应用程序的第一个请求通常比进程的生命周期中的平均响应时间慢得多。这个预热期通常可以归因于延迟类加载和及时编译。记住,对于低延迟应用程序,我们需要预先缓存所有类,以便在运行时访问时立即可用。这种调优JVM的过程称为预热。转载 2019-12-25 16:45:37 · 1683 阅读 · 0 评论 -
JVM :内存模型(主内存,工作内存)。
每个线程有自己的工作空间,称之为栈,而每个栈元素(栈帧)对应一个方法,这个栈帧里边又会分为局部变量、计数器等等区域。每次new的时候,对象会分配在堆,也就是主内存,线程是通过拷贝副本的方式把变量从主内存到工作内存。转载 2019-11-26 23:56:58 · 548 阅读 · 0 评论 -
JVM编译优化技术:公共子表达式消除。
语言无关的经典优化技术之一:公共子表达式消除。公共子表达式消除是一个普遍应用于各种编译器的经典优化技术,他的含义是:如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式。对于这种表达式,没有必要花时间再对他进行计算,只需要直接用前面计算过的表达式结果代替E就可以了。如果这种优化仅限于程序的基本块内,便称为局部公共子表达式消除(...转载 2019-05-16 17:27:10 · 3124 阅读 · 0 评论 -
HotSpot的算法实现。
HotSpot虚拟机上实现算法(对象存活判定算法和垃圾收集算法)时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行。枚举根节点 从可达性分析中从GC Roots节点找引用链这个操作为例,可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,现在很多应用仅仅方法区就有数百兆,如果要逐个检查这里面...转载 2018-03-29 15:39:01 · 695 阅读 · 0 评论 -
JVM:类的实例化顺序。
父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行 父类构造方法 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行 子类构造方法结论对象初始化的顺序,先静态方法,再构造方法,每个又是先基类后子类。转载:https://www.cnblogs....转载 2019-03-18 15:59:01 · 308 阅读 · 0 评论 -
JVM:Java 内存区域和GC机制。
Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对JVM(Java Virtual Machine)中的内存...转载 2019-04-08 15:03:09 · 601 阅读 · 0 评论 -
Java:类加载器及如何加载类(双亲委派)。
基本信息每个开发人员对java.lang.ClassNotFoundException这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载。Java的类加载机制是技术系中比较核心的部分,虽然和大部分开发人员直接打交道不多,但是对其背后的机理有一定理解有助于排查程序中出现的类加载失败等技术问题,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助。java虚拟机类加载...转载 2019-04-09 14:02:49 · 286 阅读 · 0 评论 -
JVM:运行时数据区域——Java堆(Java Heap)。
对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中描述是:所有的对象实例以及数组都要在堆上分配,但是随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化...转载 2018-03-27 11:41:03 · 1316 阅读 · 0 评论 -
运行时数据区域——本地方法栈(Native Method Stack)。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-03-27 11:29:25 · 1247 阅读 · 0 评论 -
运行时数据区域——Java虚拟机栈(Java Virtual Machine Stacks)。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-03-27 11:18:40 · 326 阅读 · 0 评论 -
运行时数据区域——程序计数器(Program Counter Register)。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-03-27 10:59:12 · 2081 阅读 · 0 评论 -
运行时数据区域——方法区(Method Area)。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-03-27 13:26:55 · 1268 阅读 · 0 评论 -
运行时数据区域——直接内存(Direct Memory)。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-03-27 13:55:23 · 7560 阅读 · 8 评论 -
JVM:JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)。
背景永久代(PermGen)在哪里?根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了):上图引自网络,但有个问题:方法区和heap堆都是线程共享的内存区域。关于方法区和永久代在HotSpot JVM中,这次讨论的永久代,就是上图的方法区(JVM规范中称为方法区)。《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。在其他J...转载 2019-04-15 10:32:14 · 208 阅读 · 0 评论 -
JVM:内存分配与回收策略。
Java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题:给对象分配内存以及回收分配给对象的内存。对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接的栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配到老年代中,分配的规则并不是百分之百固定的,其细节取决于...转载 2019-05-20 16:05:26 · 450 阅读 · 0 评论 -
JVM:编译优化技术(运行期)概览及示例。
Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释执行字节码时额外消耗时间的原因外,还有一个很重要的原因就是虚拟机设计团队几乎把对所有优化措施都集中在了即时编译器之中(在JDK 1.3之后,Javac就去除了-O选项,不会生成任何字节码级别的优化代码了),因此一般来说,即时编译器产生的本地代码会比Javac产生的字节码更加优秀(本地代码与字节码两者是...转载 2019-05-16 17:02:34 · 396 阅读 · 0 评论 -
Java:内存模型。
Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。在此之前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异,有可能导致程序在一套平台上并发无安全正常,而在另外一套平台上并发访问却经常出错,因此在某...转载 2019-06-11 09:26:45 · 187 阅读 · 0 评论 -
JVM:字节码生成技术与动态代理的实现。
“字节码生成”并不是什么高深的技术,读者在看到“字节码生成”这个标题时也先不必去想诸如Javassist、CGLib、ASM值类的字节码类库,因为JDK里面的javac命令就是字节码生成技术的“老祖宗”,并且javac也是一个由Java语言写成的程序,他的代码存放在OpenJDK的langtools/src/share/classes/com/sun/tools/javac目录中。要深入了解字节码...转载 2019-06-04 16:59:41 · 730 阅读 · 0 评论 -
JVM:方法调用之分派。
众所周知,Java是一门面向对象的程序语言,因为Java具备面向对象的3个基本特征:继承、封装和多态。本文讲解的分派调用过程将会揭示多态性特征的一些最基本的体现,如“重载”和“重写”在Java虚拟机之中是如何实现的,这里的实现当然不是语法上该如何写,我们关心的依然是虚拟机如何确定的目标方法。静态分派(重载)在开始讲解静态分派前,这里准备了一段经常出现在面试题中的程序代码,后面我们的话题将围...转载 2019-05-29 15:22:23 · 301 阅读 · 0 评论 -
JVM:方法调用之解析。
方法调用方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。在程序运行时,进行方法调用是最普遍、最频繁的操作,Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用)。这个特性给Java带来了更强...转载 2019-05-29 11:21:02 · 362 阅读 · 0 评论 -
JVM:运行时栈帧结构。
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,他是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态链接库和方法返回地址等信息。每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。每一个栈帧都包括了局部变量表、操作数栈、动态连接、方法返回地址和一些额外...转载 2019-05-28 16:21:26 · 892 阅读 · 0 评论 -
OSGi:灵活的类加载器架构。
Java程序社区中流传着这么一个观点:“学习JEE规范,去看JBoss源码;学习类加载器,就去看OSGi源码”。机关“JEE规范”和“类加载器的知识”并不是一个对等的概念,不过,既然这个观点能在程序员中流传开来,也从侧面说明了OSGi对类加载器的运用确实有其独到之处。OSGi(Open Service Gateway Initiative)是OSGi联盟(OSGi Alliance)制定的一个基...转载 2019-05-31 13:44:15 · 758 阅读 · 0 评论 -
Retrotranslator:跨越JDK版本。
一般来说,以“做项目”为主的软件公司比较容易更新技术,在下一个项目中换一个技术框架、升级到最新的JDK版本,甚至把Java换成C#、C++来开发程序都是有可能的。但当公司发展壮大,技术有所积累,逐渐成为以“做产品”为主的软件公司后,自主选择技术的权力就会丧失掉,因为之前所积累的代码和技术都是用真金白银换来的,一个稳健的团队也不会随意的改变底层的技术。然而在飞速发展的程序设计领域,新技术总是日新月异...转载 2019-06-05 13:56:28 · 524 阅读 · 0 评论 -
JVM:基于栈的字节码解释执行引擎。
许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,在本文,我们先来探讨一下在解释执行时,虚拟机执行引擎是如何工作的。解释执行Java语言经常被人们定位为“解释执行”的语言,在Java初生的JDK 1.0时代,这种定义还算是比较准确的,但当主流的虚拟机中都包含了即时编译器后,Class文件中的代码到底会被解...转载 2019-05-30 16:43:50 · 669 阅读 · 0 评论 -
JVM:方法调用之动态类型语言支持。
Java虚拟机的字节码指令集的数量从Sun公司的第一款Java虚拟机问世至JDK 7来临之前的十余年时间里,一致没有发生任何变化。随着JDK 7的发布,字节码指令集终于迎来了第一位新成员——invokedynamic指令。这条新增加的指令是JDK 7实现“动态类型语言”(Dynamically Typed Language)支持而进行的改进之一,也是为JDK 8可以顺理实现Lambda表达式做技术...转载 2019-05-30 14:43:02 · 693 阅读 · 0 评论 -
JVM:字节码指令。
加载和存储指令加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输,这类指令包括如下内容。将一个局部变量加载到操作栈:iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n>。将一个数值从操作数栈存储到局部...转载 2019-05-22 10:36:21 · 333 阅读 · 0 评论 -
JVM编译优化技术:逃逸分析。
最前沿的优化技术之一:逃逸分析。逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术,它与类型继承关系分析一样,并不是直接优化代码的手段,而是为其他优化手段提供依据的分析技术。逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,称之为方法逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变...转载 2019-05-16 23:16:36 · 256 阅读 · 0 评论 -
JVM编译优化技术:方法内联。
最重要的优化技术之一:方法内联。方法内联,它是编译器最重要的优化手段之一,除了消除方法调用的成本之外,它更重要的意义是为其他优化手段建立良好的基础,如下所示的简单例子就揭示了内联对其他优化手段的意义:事实上testInline()方法的内部实现全部都是无用的代码,如果不做内联,后续即使进行了无用代码消除的优化,也无法发现任何“Dead Code”,因为如果分开来看,foo()和testInli...转载 2019-05-16 21:43:16 · 1274 阅读 · 0 评论 -
HotSpot虚拟机对象探秘——对象内存布局。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-03-28 10:06:52 · 326 阅读 · 0 评论 -
HotSpot虚拟机对象探秘——对象的访问定位。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-03-28 10:36:27 · 738 阅读 · 0 评论 -
JVM:虚拟机类加载机制——类加载的时机。
类从被加载到虚拟机内存中开始,到卸载出内存为止,他的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking),这7个阶段的发生顺序如下图所示。...转载 2018-04-16 10:22:17 · 169 阅读 · 0 评论 -
字节码与数据类型。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-04-10 17:06:59 · 675 阅读 · 0 评论 -
字节码指令简介。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-04-10 16:31:10 · 182 阅读 · 0 评论 -
属性表集合。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-04-10 11:44:31 · 3174 阅读 · 3 评论 -
方法表集合。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-04-09 13:42:44 · 423 阅读 · 0 评论 -
字段表集合。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-04-09 11:26:30 · 3262 阅读 · 0 评论 -
类索引、父类索引与接口索引集合。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-04-08 18:53:29 · 613 阅读 · 1 评论 -
访问标志。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-04-08 17:25:05 · 715 阅读 · 0 评论 -
常量池。
博文中的内容来源《深入理解Java虚拟机_JVM高级特性与最佳实践》这一本书,感激不尽。转载 2018-04-08 16:22:26 · 1038 阅读 · 0 评论