Java中对象创建时的内存分配
一、前言知识铺垫
1、逃逸对象:在一个方法内创建的对象没有被外界引用则称该对象为未逃逸的对象。
2、JDK1.6以后的HotSpot虚拟机支持运行时的对象逃逸分析。
3、JVM中的参数配置:
1)-XX:+PrintFlagsInitial --查看JVM中的默认参数信息 2)--XX:+DoEscapeAnalysis --开启对象的逃逸分析(JDK8中默认开启) 3)--XX:-DoEscapeAnalysis --关闭对象的逃逸分析 4)-XX:+PrintGC --输出GC的基本信息 5)-XX:+PrintGCDetails --输出GC的详细信息 6)-Xmx5m/-Xms5m --最大/最小堆配置
二、对象创建时的内存分配
1、对象创建时有可能分配在堆上也有可能分配在栈上。
2、方法内部创建的小对象并且没有逃逸可能分配在栈上。
3、JDK8默认打开逃逸分析,对JVM的执行会有性能上的提高。
4、设计对象时,假如对象不会被多线程共享,多个方法共享,此时,对象的引用应该尽量使用局部变量。
三、逃逸分析的开启与关闭对JVM执行性能的影响
首先,我们先来看一个实例。
public class TestObjectInstance01 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
//调用alloc()方法
alloc();
}
long end = System.currentTimeMillis();
System.out.println("运行时间:"+(end-start));
}
private static void alloc() {
//创建一个只能存储一个字节的数组对象
byte[] arr = new byte[1];
arr[0] = 10;
}
}
我们配置了JVM的最大/最小堆参数,并开启了逃逸分析:
-Xmx5m -Xms5m -XX:+DoEscapeAnalysis -XX:+PrintGC
运行结果:

接着我们又关闭了逃逸分析:
-Xmx5m -Xms5m -XX:-DoEscapeAnalysis -XX:+PrintGC
运行结果:

结果分析:
我们可以看到,开启逃逸分析时,JVM的运行性能要远高于未开启时。因为栈上分配的对象不需要启动GC来进行回收,当调用的方法出栈时,该对象会自动销毁。
Java中对象创建时的内存分配的更多相关文章
- 【java虚拟机序列】java中的垃圾回收与内存分配策略
在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...
- Java中对象创建过程
本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
/* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Par ...
- java之对象创建时各成员变量的初始值
除了byte short int long float double char bollean这基础类型外,其余的都是引用类型 成员变量类型 初始值 byte 0 short 0 int 0 long ...
- 2018.9.30 Java中数组的存储与内存分配
java 数组与集合的区别 集合:长度可变,可以存放不同类型的元素,只能存放引用类型! 数组:长度固定,只可以存放相同的同种类型的元素,可以存放数据类型也可以存放引用类型! 数组定义的三种方式 // ...
- Java中对象并不是都在堆上分配内存的
转(https://blog.51cto.com/13906751/2153924) 前段时间,给星球的球友们专门码了一篇文章<深入分析Java的编译原理>,其中深入的介绍了Java中的j ...
- Java中类,对象,方法的内存分配
Java中类,对象,方法的内存分配 以下针对引用数据类型: 在内存中,类是静态的概念,它存在于内存中的CodeSegment中. 当我们使用new关键字生成对象时,JVM根据类的代码,去堆内存中开辟一 ...
- java中对象的创建过程
public class Test1 { public static void main(String[] args) { new B(); System.out.println("---- ...
- java中的各种数据类型在内存中存储的方式
原文地址:http://blog.csdn.net/aaa1117a8w5s6d/article/details/8251456 1.Java是如何管理内存的 java的内存管理就是对象的分配和释放问 ...
随机推荐
- 通过livy向CDH集群的spark提交任务
场景 产品中需要通过前端界面选择执行某种任务(spark任务),然后通过livy 的restful api 提交集群的spark任务 简单介绍下livy,翻译自官网: Livy是基于Apache许可的 ...
- 常用高效 Java 工具类总结
一.前言 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码 ...
- Hive 系列(七)—— Hive 常用 DML 操作
一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (p ...
- Nginx总结(一)Linux下如何安装Nginx
以前写过一些Nginx的文章,但都是用到什么说什么,没有一个完整系统的总结.趁最近有时间,打算将Nginx相关的内容重新整理一下.nginx系列文章地址如下:https://www.cnblogs.c ...
- win10下配置chromedrive。
0x01:查看自己chrome的版本号 点击chrome右上角菜单栏,帮助,关于Google chrome,在这里,你可以看到自己chrome的版本号. 0x02:下载对应的chrome drive ...
- python学习之并发编程
目录 一.并发编程之多进程 1.multiprocessing模块介绍 2.Process类的介绍 3.Process类的使用 3.1 创建开启子进程的两种方式 3.2 获取进程pid 3.3验证进程 ...
- SparkSql学习笔记(包含IDEA编写的本地代码)
Spark SQL and DataFrame 1.为什么要用Spark Sql 原来我们使用Hive,是将Hive Sql 转换成Map Reduce 然后提交到集群上去执行,大大简化了编写MapR ...
- Leetcode之二分法专题-278. 第一个错误的版本(First Bad Version)
Leetcode之二分法专题-278. 第一个错误的版本(First Bad Version) 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版 ...
- [Python] Django框架入门
说明:Django框架入门 当前项目环境:python3.5.django-1.11 项目名:test1 应用名:booktest 命令可简写为:python manager.py xxx => ...
- 证书pfx转jks
keytool -importkeystore -srckeystore 2756649_order.hanels-home.com.pfx -srcstoretype pkcs12 -destke ...