首页 > 系统相关 >内存逃逸

内存逃逸

时间:2022-08-20 16:25:21浏览次数:43  
标签:String StringBuffer XX 逃逸 内存 标量 sb

逃逸分析,其实就是分析一个对象是否会逃逸出方法,分析对象的动态作用域。如果一个对象在一个方法内定义,并且有可能被方法外部引用使用,那认为它逃逸了。

 

public static StringBuffer craeteStringBuffer(String s1, String s2) {

    StringBuffer sb = new StringBuffer();

    sb.append(s1);

    sb.append(s2);

    return sb;

}

 

public static String createStringBuffer(String s1, String s2) {

    StringBuffer sb = new StringBuffer();

    sb.append(s1);

    sb.append(s2);

    return sb.toString();

}

复制代码

第一段代码中的sb就逃逸了,而第二段代码中的sb就没有逃逸。

 

 

JDK1.7 开始,逃逸分析默认是开启的,可以通过以下参数进行启停。

 

# 开启

-XX:+DoEscapeAnalysis

# 关闭

-XX:-DoEscapeAnalysis

 

如果分析一个对象没有逃逸出方法的时候,就有可能被分配到栈上。执行完就清理了,这样就不需要在堆中进行 GC 回收,提高了性能。

 

 

示例:

-XX:-DoEscapeAnalysis  关闭逃逸分析

-XX:+DoEscapeAnalysis  开启逃逸分析 默认的

 

 

锁消除

通过逃逸分析来判断同步块所使用的锁是否只被一个线程访问而没有被发布到其他线程,没有则可以取消这个锁,锁消除就是从这来的。

 

 

标量替换

标量是指不可分割的量,如java中基本数据类型和reference类型,相对的一个数据可以继续分解,称为聚合量;

 

如果把一个对象拆散,将其成员变量恢复到基本类型来访问就叫做标量替换;

 

如果逃逸分析发现一个对象不会被外部访问,并且该对象可以被拆散,那么经过优化之后,并不直接生成该对象,而是在栈上创建若干个成员变量;

 

通过-XX:+EliminateAllocations可以开启标量替换, -XX:+PrintEliminateAllocations查看标量替换情况。

 

 

 

 

标签:String,StringBuffer,XX,逃逸,内存,标量,sb
From: https://www.cnblogs.com/gustavo/p/16607960.html

相关文章

  • vb.net中读取其它进程内存的问题
    问题描述在vb.net下用ReadProcessMemory总是读不了内存的内容。似乎是普遍存在的一个问题,不知道大家有什么好的方法,ReadProcessMemory要怎么调用和声明,或用其它的方法......
  • Redis 内存占满
    1.案例redis内存占用满了错误提示:OOMcommandnotallowedwhenusedmemory>‘maxmemory’2.排查步骤确定哪台redis服务器使用set命令随便设置值,查看是否成......
  • 指针在内存所占的大小
    sizeof的特点:printf(”%d“,int);printf(”%d“,float);printf(”%d“,double);其结果为444这就是面试的时候问你,指针在内存中占多少个字节?这就是个问题不是简单的2,4,甚至8个字节回答:......
  • Java内存分析相关工具
    1、jps工具jps(JavaVirtualMachineProcessStatusTool)是JDK提供的一个可以列出正在运行的Java虚拟机的进程信息的命令行工具,它可以显示Java虚拟机进程的执行主类(Ma......
  • 计算机内存容量单位
    计算机内存容量单位1、什么是计算机的内存容量单位:计算机的内存容量通常是指随机存储器(RAM)的容量,是内存条的关键性参数。内存容量以MB作为单内容存量位,可以......
  • Linux下C语言程序的内存布局
    在《虚拟地址空间以及编译模式》一节中讲到,虚拟地址空间在32位环境下的大小为4GB,在64位环境下的大小为256TB,那么,一个C语言程序的内存在整个地址空间中是如何分布的呢?数据......
  • ASP.NET Core :缓存系列(四):内存缓存 MemoryCache
    System.Runtime.Caching/MemoryCacheICacheEntry接口中的属性:具体设置过期时间可以参考:微软文档ICacheEntry接口缓存基本使用(一)绝对过期AbsoluteExpirationRela......
  • 内存分配
    参考:https://blog.csdn.net/weixin_50901683/article/details/113774484一、内存分为四个区:代码区、全局区、栈区、堆区程序运行前:在程序编译后,生成exe可执行程序,未执行......
  • 如何从内存存储的角度解释小端和大端格式的概念?
    字节序(大、小端存储)是指字节存储在内存中的顺序。内存通常是字节可寻址的,但大多数计算机体系结构都适用于32位大小或字大小(4字节)的操作数。因此,要将一个字存储到字节......
  • 堆外内存的回收机制分析
    堆外内存JVM启动时分配的内存,称为堆内存,与之相对的,在代码中还可以使用堆外内存,比如Netty,广泛使用了堆外内存,但是这部分的内存并不归JVM管理,GC算法并不会对它们进行回收,所......