iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >简述Java编程语言中的逃逸分析
  • 606
分享到

简述Java编程语言中的逃逸分析

java编程语言逃逸分析 2023-05-31 04:05:13 606人浏览 安东尼
摘要

        大家一般认为new出来的对象都是被分配在堆上,但这并不是完全正确,通过对Java对象分配过程分析,我们发现对象除了可以被分配在堆上,还可以在栈或TLAB中

        大家一般认为new出来的对象都是被分配在堆上,但这并不是完全正确,通过对Java对象分配过程分析,我们发现对象除了可以被分配在堆上,还可以在栈或TLAB中分配空间。而栈上分配对象的技术基础是逃逸分析和标量替换,本文主要介绍下逃逸分析。

1.逃逸分析的定义

        逃逸分析:是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法

        通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。

        Java在Java SE 6u23以及以后的版本中支持并默认开启了逃逸分析的选项。Java的 HotSpot JIT编译器,能够在方法重载或者动态加载代码的时候对代码进行逃逸分析。

        逃逸分析的基本行为就是分析对象的动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用。

        方法逃逸:例如作为调用参数传递到其他方法中。

        线程逃逸:有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量。

2.逃逸分析的理论基础

        基于 Jong-Deok Choi, Manish Gupta, Mauricio Seffano,Vugranam C. Sreedhar, Sam Midkiff等在论文《Escape Analysis for Java》中描述的算法进行逃逸分析。

        该算法引入了连通图,用连通图来构建对象和对象引用之间的可达性关系,并在次基础上,提出一种组合数据流分析法。由于该算法是上下文相关和流敏感的,并且模拟了对象任意层次的嵌套关系,所以分析精度较高,只是运行时间和内存消耗相对较大。

        绝大多数逃逸分析的实现都基于“封闭世界(closed world)”的前提:所有可能被执行的,方法在做逃逸分析前都已经得知,并且,程序的实际运行不会改变它们之间的调用关系 。但当真实的 Java 程序运行时,这样的假设并不成立。Java 程序拥有的许多特性,例如动态类加载、调用本地函数以及反射程序调用等等,都将打破所谓“封闭世界”的约定。

逃逸分析之后的处理操作

        经过逃逸分析之后,可以得到对象三种可能的逃逸状态
        GlobalEscape(全局逃逸): 即一个对象的引用逃出了方法或者线程。例如,一个对象的引用是复制给了一个类变量,或者存储在在一个已经逃逸的对象当中,或者这个对象的引用作为方法的返回值返回给了调用方法。

        ArgEscape(参数级逃逸):即在方法调用过程当中传递对象的应用给一个方法。这种状态可以通过分析被调方法的二进制代码确定。

        NoEscape(没有逃逸):一个可以进行标量替换的对象。该对象可以不被分配在传统的堆上。

        编译器可以使用逃逸分析的结果,对程序进行优化

        堆分配对象变成栈分配对象:一个方法当中的对象,对象的引用没有发生逃逸,那么这个方法可能会被分配在栈内存上而非常见的堆内存上。

        消除同步:线程同步的代价是相当高的,同步的后果是降低并发性和性能。逃逸分析可以判断出某个对象是否始终只被一个线程访问,如果只被一个线程访问,那么对该对象的同步操作就可以转化成没有同步保护的操作,这样就能大大提高并发程度和性能。

        矢量替代:逃逸分析方法如果发现对象的内存存储结构不需要连续进行的话,就可以将对象的部分甚至全部都保存在CPU寄存器内,这样能大大提高访问速度。

总结

以上是本文关于逃逸分析的全部内容,希望对大家有所帮助。

--结束END--

本文标题: 简述Java编程语言中的逃逸分析

本文链接: https://www.lsjlt.com/news/223499.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 简述Java编程语言中的逃逸分析
            大家一般认为new出来的对象都是被分配在堆上,但这并不是完全正确,通过对Java对象分配过程分析,我们发现对象除了可以被分配在堆上,还可以在栈或TLAB中...
    99+
    2023-05-31
    java 编程语言 逃逸分析
  • Go语言中的逃逸分析究竟是什么?
    目录1、逃逸分析介绍2、Go中内存分配在哪里?3、Go与C++内存分配的区别4、逃逸分析骚操作5、逃逸分析引申示例说明 1、逃逸分析介绍 学计算机的同学都知道,在编译原理中,分析指针...
    99+
    2022-11-12
  • Go语言中内存管理逃逸分析详解
    目录1. 前言2. 逃逸策略3. 逃逸场景3.1 指针逃逸3.2 栈空间不足逃逸3.3 动态类型逃逸3.4 闭包引用对象逃逸4.逃逸总结5. 注意事项1. 前言 所谓的逃逸分析(Es...
    99+
    2023-03-15
    Go 内存管理逃逸分析 Go 内存管理逃逸 Go 内存管理
  • 简述Java编程语言对象的容纳
    如果一个程序只含有数量固定的对象,而且已知它们存在的时间,那这个程序是相当简单的。数组容纳对象有很多方式,数组是其中最为普遍的一种,它主要有如下两个特点:效率和类型。对于Java来说,为保存和访问一系列对象(实际是对象的句柄),最有效率的方...
    99+
    2023-05-31
    java 对象容纳 ava
  • 如何进行Go编程语言的简单分析
    今天就跟大家聊聊有关如何进行Go编程语言的简单分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Go 是一门用于并发编程的命令式编程语言,它主要由创造者 Google 进行开发,最初...
    99+
    2023-06-16
  • Java语言编码规范的示例分析
    这篇文章跟大家分析一下“Java语言编码规范的示例分析”。内容详细易懂,对“Java语言编码规范的示例分析”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“Java语言编码规范的示例...
    99+
    2023-06-03
  • 编程语言中this、call、apply的用法分析
    小编给大家分享一下编程语言中this、call、apply的用法分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言+思考题记得当时找实习的时候,总是会在简历上...
    99+
    2023-06-14
  • C++语言的各种编程技巧分析
    这篇文章主要介绍“C++语言的各种编程技巧分析”,在日常操作中,相信很多人在C++语言的各种编程技巧分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++语言的各种编程技巧分析”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-17
  • 汇编语言的函数式编程实例分析
    这篇文章主要介绍了汇编语言的函数式编程实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇汇编语言的函数式编程实例分析文章都会有所收获,下面我们一起来看看吧。一切都是为了消除副作用要了解函数式编程,我们需要首...
    99+
    2023-06-27
  • Java编程与自然语言处理:如何实现语义分析?
    自然语言处理(NLP)是一种人工智能领域,它涉及使用计算机来处理和分析自然语言。在过去的几十年中,NLP已经取得了非常显著的进展,其中语义分析是其中的一个重要方面。在本文中,我们将介绍如何使用Java编程实现语义分析。 语义分析是指对自然...
    99+
    2023-08-27
    编程算法 自然语言处理 linux
  • C语言中程序编译系统的示例分析
    这篇文章主要介绍C语言中程序编译系统的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!程序的翻译环境和执行环境在ANSI C的任何一种实现中,存在两个不同的环境 :第1种是翻译环境,在这个环境中源代码被转换为可...
    99+
    2023-06-29
  • web编程语言的数据亲和力分析
    本篇内容主要讲解“web编程语言的数据亲和力分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web编程语言的数据亲和力分析”吧!目前,程序设计语言似乎进入了一...
    99+
    2022-10-19
  • JAVA语言中关于EJB技术的分析
    本篇内容主要讲解“JAVA语言中关于EJB技术的分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JAVA语言中关于EJB技术的分析”吧!JAVA语言中关于EJB技术概论,Enterprise ...
    99+
    2023-06-17
  • go语言中的协程实例分析
    这篇文章主要讲解了“go语言中的协程实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言中的协程实例分析”吧!协程的特点该任务的业务代码主动要求切换,即主动让出执行权限发生了IO,...
    99+
    2023-07-02
  • PYPL6月编程语言排行中Kotlin 与 PHP的示例分析
    本篇文章为大家展示了PYPL6月编程语言排行中Kotlin 与 PHP的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。PYPL 发布了 6 月份编程语言排行...
    99+
    2022-10-19
  • Go语言、Git和JavaScript:异步编程的比较分析
    异步编程是现代软件开发中的一个重要概念。它允许我们在执行长时间操作时不会阻塞应用程序,从而提高了应用程序的响应性能。在本文中,我们将比较分析三种流行的编程语言:Go语言、Git和JavaScript的异步编程模型。 Go语言 Go语言的异步...
    99+
    2023-11-04
    git javascript 异步编程
  • Java语言在自然语言处理中的优势与劣势分析
    自然语言处理(Natural Language Processing,NLP)是人工智能领域的一个重要分支,旨在让计算机能够理解、处理和生成人类的自然语言。在NLP领域,Java语言作为一种主流编程语言,具有不同于其他语言的优势和劣势。本...
    99+
    2023-06-04
    numpy 自然语言处理 索引
  • 编程语言之高并发系统中限流的示例分析
    这篇文章主要介绍了编程语言之高并发系统中限流的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。本文结合作者的...
    99+
    2023-05-30
    编程语言
  • golang中极简流式编程的示例分析
    这篇文章主要为大家展示了“golang中极简流式编程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“golang中极简流式编程的示例分析”这篇文章吧。传统的过程编码方式带来的弊端是显而易...
    99+
    2023-06-20
  • 使用Python编程语言进行实践的示例分析
    这篇文章将为大家详细讲解有关使用Python编程语言进行实践的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。其实Python真的挺有意思的,用Python用做过不少有趣好玩的事儿,这...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作