Java逃逸分析(附实际例子分析)

news2025/1/8 5:37:00

Java逃逸分析

1. 什么是Java逃逸分析

我们知道对象一般是在堆上生成的,但这并不是绝对的。特例就是今天要说的逃逸分析。

JVM 在分析代码以后,发现一个对象在声明之后,只有在它当前声明的这个函数中调用,那么它就会将这个对象在栈上申请空间。而不是在堆上。这就是JDK6出的逃逸分析。因为在栈上创建的对象,在函数执行完毕以后,会将这个对象清理。这样就大大减轻了GC的压力。

2. 举一个例子

写一段代码

现在在代码里面声明了一个Integer 对象。注意这个对象要大于127。或者要小于-128。why?

Boolean、Byte的所有对象,都是预先创建好的(类加载的时候)Character、Short、Integer、Long是-128~127的对象是预先创建好的(Character没有负数)
如果new Integer(1)则是从创建好的缓存中,直接拿出,因而是同一个。
为了节省内存,这些数字使用概率很高,早就创建好,之后都用同一个,是提高效率的做法。

package org.example;

public class Main2 {

    public static void main(String[] args) {

        while (true) {
            Integer integer = new Integer(1111);
        }
    }
}

设置JVM内存

编辑运行的模式,设置堆的最大为10M,最小也为10M,也就是堆的大小就是10M,并且设置打印GC的过程。设置堆的大小为10M的原因是JVM 可以尽快的进入GC。

设置JVM堆大小的命令如下:

-Xmx10m -Xms10m -XX:+PrintGC

关闭逃逸分析,观察现象

因为JDK6以后,默认开了逃逸分析。可以通过 -XX:-DoEscapeAnalysis, 可以关闭逃逸分析。

关闭逃逸分析,运行程序,我们可以看到程序在疯狂的进行GC。
在这里插入图片描述

开启逃逸分析,观察现象

开启逃逸分析,运行程序,只看到程序只进行了2次GC。这就是逃逸分析带来的好处。
在这里插入图片描述

3. 小结

逃逸分析是分析了对象只在当前函数范围内使用,因而改为在栈上申请空间。而栈是函数运行完毕以后,就会立即清理的。所以不需要等到GC了,大大缓解了GC的压力。当然如果不是只在当前函数范围内用到的对象不行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《微SaaS创富周刊》第3期:GPT-3\ChatGPT、Stable Diffusion等AI模型驱动的微SaaS创意盘点

大家新年好!第3期《微SaaS创富周刊》问世啦!本周刊面向独立开发者、早期创业团队,报道他们主要的产品形态——微SaaS如何变现的最新资讯和经验分享等。所谓微SaaS,就是“针对利基市场的SaaS”,特点是一般由个人或者小团…

网络爬虫的危害与防御方法

爬虫程序是一种计算机程序,旨在通过执行自动化或重复性任务来模仿或替代人类的操作。爬虫程序执行任务的速度和准确性比真实用户高得多。爬虫程序在互联网上扮演着各种各样的角色,超过一半的网络流量是由爬虫程序产生的。有些爬虫程序非常有用&#xff0…

v-if和v-show的区别?使用场景?v-if状态改变调用钩子函数的示例

文章目录1、v-show与v-if的共同点2、v-show与v-if的区别3、v-show与v-if的使用场景4、附属到组件和普通元素时的情况4.1、v-show4.2、v-if5、具体实现的效果5.1 查看是否渲染5.2 查看调用的钩子函数6、钩子函数实现的过程分析1、v-show与v-if的共同点 v-show和v-if的作用效果是…

共享模型之管程(五)

1.多线程设计模式 1.1.同步模式之保护性暂停 1.1.1.定义 1>.即Guarded Suspension,用在一个线程等待另一个线程的执行结果的场景中; 2>.使用场景 ①.有一个结果(数据)需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject; ②.如果有结果(数据)不断从一个…

Vitepress(一):基础教程

什么是Vitepress Vitepress是使用Vue3Vite来快速搭建一个个人网站的工具,网站搭建者不需要掌握Vue3,Vite等的具体内容,只需要简单的配置就可以生成Vue风格的个人网站 官方地址:https://vitejs.cn/vitepress/ 本教程希望教会大家…

SD Nand 与 SD卡 SDIO模式应用流程

SD Nand/SD卡 SDIO模式应用流程 文章目录SD Nand/SD卡 SDIO模式应用流程1. 前言1.1 参考文档1.2 概述2. Response响应类型及格式3. 各步骤流程3.1 卡识别流程3.2 通讯速率及总线宽度修改流程3.3 擦除流程3.4 单块读流程3.5 单块写流程3.6 多块读流程3.7 多块写流程4. 结束语SD …

Java初识泛型 | 如何通过泛型类/泛型方法实现求数组元素最大值?

目录 一、引言 二、编程分析 1、泛型类实现 思路 代码 2、泛型方法实现 思路 代码 三、拓展:数组排序(以冒泡排序为例) 1、int类型 原代码 2、泛型类 3、泛型方法 一、引言 给定一个整型数组,求数组中所有元素的最大…

JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)

文章目录前言一、class文件初始化过程1、概述2、初始化过程-案例1a、代码T001_ClassLoadingProcedure 类加载过程b、解析3、初始化过程-案例2a、代码b、解析二、单例模式-双重检查三、硬件层数据一致性1、硬件层的并发优化基础知识b、Intel 的缓存一致性协议:MESI四…

Vivado综合设置之-keep_equivalent_registers

-keep_equivalent_registers即保留等效寄存器,所谓等效寄存器是指共享输入端口(输入时钟端口clk和输入数据端口rst)的寄存器。 勾选它时,意味着Vivado不会对等效寄存器进行优化; 不勾选它时(默认情况&…

eclipse安装UML插件

安装AmaterasUML AmaterasUML 是一个用于 Eclipse 的轻量级 UML 和 ER 图编辑器。 将AmaterasUML的3个jar包拷到Eclpise的plugins文件下: 重启eclipse 在新建菜单中可以发现已经出现了UML文件选项 安装GEF插件(Eclipse2018-12 以后无需安装&#xf…

②电子产品拆解分析-电动牙刷

②电子产品拆解分析-电动牙刷一、功能介绍二、电路分析以及器件作用1、振动电机开关控制电路2、锂电池供电与充电电路三、本产品的优缺点1、优点:2、缺点:一、功能介绍 ①5档工作模式;②2分钟倒计时停止工作;③工作续航一个星期以…

【MySQL】详解索引操作

索引什么是索引?索引的优势和劣势索引类型按数据结构分类按物理存储分类按字段特性分类主键索引唯一索引普通索引全文索引前缀索引按字段个数分类索引操作创建索引创建主键索引唯一索引的创建普通索引的创建全文索引的创建explain工具查询索引删除索引索引最好设置为…

SQL 注入学习路线

学习路线(大致) HTML > SQL > Python > SQL 注入(使用 sqli-labs 靶场来学习 SQL 注入) HTML 视频 【前端开发入门教程,web前端零基础html5 css3前端项目视频教程】 要求 使用该视频进行 HTML 基础部分…

Python之字符串的特点

1.布尔值 Python2中没有布尔值,直接用数字0表示Flase,用数字1表示True。Python3中,把True和False定义成了关键字,但他们的本质还是1和0,甚至可以和数字相加。 >>> a True >>> b 3 >>> …

[多图,秒懂]如何训练一个“万亿大模型”?

1. 背景近几年,随着“大模型”概念的提出,深度学习模型越来越大,如何训练这些大模型成为一个亟待解决的工程问题。最初的视觉模型只有几百兆的参数量,而现在的语言模型中,动则百亿,千亿的参数量&#xff0c…

[golang工作日记] for range 踩坑

1、for range指针赋值 Ops的数据保存在两个表中,一个是ops_tab,另一个是staff_tab,其中ops_tab的staff_id是staff_tab的外键,两个表都有staff_id字段。 type OpsDetail struct {OpsId stringStaffId stringOps *model.Ops…

Node.js安装配置

目录1. 下载node2. 安装3. 检查是否安装成功4. 配置缓存路径5. 实现一个demo1. 下载node 官方地址https://nodejs.org/en/下载长期支持版本 2. 安装 一路next node一起安装npm 这个地方不要勾选 安装成功 3. 检查是否安装成功 cmd运行下面命令 # 查看node的版本 node -v # …

【博客571】“时序敏感应用“ 如何prometheus自定义上报时间戳

“时序敏感应用” 如何prometheus自定义上报时间戳 1、场景 在物理网络监控中,对于流量趋势是极其敏感的,物理网络监控流量的点通常是秒级别甚至毫秒级别,此时这些时许点通过各种上报上传到监控系统中,由于网络波动,可…

Kubernetes v1.24.2高可用部署

sskubeasz 1、Kubeasy简介 kubeasz 致力于提供快速部署高可用k8s集群的工具, 同时也努力成为k8s实践、使用的参考书;基于二进制方式部署和利用ansible-playbook实现自动化;既提供一键安装脚本, 也可以根据安装指南分步执行安装各个组件。 kubeasz 从每…

【lc刷题 day12】堆/栈/队列

BM42 用两个栈实现队列 easy import java.util.Stack;public class Solution {Stack<Integer> stack1 new Stack<Integer>();Stack<Integer> stack2 new Stack<Integer>();public void push(int node) {stack1.push(node);}public int pop() {if(st…