Java中对象创建时的内存分配
2019-09-30 06:51:35来源:博客园 阅读 ()
Java中对象创建时的内存分配
一、前言知识铺垫
1、逃逸对象:在一个方法内创建的对象没有被外界引用则称该对象为未逃逸的对象。
2、JDK1.6以后的HotSpot虚拟机支持运行时的对象逃逸分析。
3、JVM中的参数配置:
1 1)-XX:+PrintFlagsInitial --查看JVM中的默认参数信息 2 3 2)--XX:+DoEscapeAnalysis --开启对象的逃逸分析(JDK8中默认开启) 4 5 3)--XX:-DoEscapeAnalysis --关闭对象的逃逸分析 6 7 4)-XX:+PrintGC --输出GC的基本信息 8 9 5)-XX:+PrintGCDetails --输出GC的详细信息 10 11 6)-Xmx5m/-Xms5m --最大/最小堆配置
二、对象创建时的内存分配
1、对象创建时有可能分配在堆上也有可能分配在栈上。
2、方法内部创建的小对象并且没有逃逸可能分配在栈上。
3、JDK8默认打开逃逸分析,对JVM的执行会有性能上的提高。
4、设计对象时,假如对象不会被多线程共享,多个方法共享,此时,对象的引用应该尽量使用局部变量。
三、逃逸分析的开启与关闭对JVM执行性能的影响
首先,我们先来看一个实例。
1 public class TestObjectInstance01 { 2 public static void main(String[] args) { 3 long start = System.currentTimeMillis(); 4 for (int i = 0; i < 100000000; i++) { 5 //调用alloc()方法 6 alloc(); 7 } 8 long end = System.currentTimeMillis(); 9 System.out.println("运行时间:"+(end-start)); 10 } 11 12 private static void alloc() { 13 //创建一个只能存储一个字节的数组对象 14 byte[] arr = new byte[1]; 15 arr[0] = 10; 16 } 17 }
我们配置了JVM的最大/最小堆参数,并开启了逃逸分析:
-Xmx5m -Xms5m -XX:+DoEscapeAnalysis -XX:+PrintGC
运行结果:
接着我们又关闭了逃逸分析:
-Xmx5m -Xms5m -XX:-DoEscapeAnalysis -XX:+PrintGC
运行结果:
结果分析:
我们可以看到,开启逃逸分析时,JVM的运行性能要远高于未开启时。因为栈上分配的对象不需要启动GC来进行回收,当调用的方法出栈时,该对象会自动销毁。
原文链接:https://www.cnblogs.com/shi-zhe/p/11580372.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash