一、前言知识铺垫

    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中对象创建时的内存分配的更多相关文章

  1. 【java虚拟机序列】java中的垃圾回收与内存分配策略

    在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...

  2. Java中对象创建过程

    本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...

  3. java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

    /* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Par ...

  4. java之对象创建时各成员变量的初始值

    除了byte short int long float double char bollean这基础类型外,其余的都是引用类型 成员变量类型 初始值 byte 0 short 0 int 0 long ...

  5. 2018.9.30 Java中数组的存储与内存分配

    java 数组与集合的区别 集合:长度可变,可以存放不同类型的元素,只能存放引用类型! 数组:长度固定,只可以存放相同的同种类型的元素,可以存放数据类型也可以存放引用类型! 数组定义的三种方式 // ...

  6. Java中对象并不是都在堆上分配内存的

    转(https://blog.51cto.com/13906751/2153924) 前段时间,给星球的球友们专门码了一篇文章<深入分析Java的编译原理>,其中深入的介绍了Java中的j ...

  7. Java中类,对象,方法的内存分配

    Java中类,对象,方法的内存分配 以下针对引用数据类型: 在内存中,类是静态的概念,它存在于内存中的CodeSegment中. 当我们使用new关键字生成对象时,JVM根据类的代码,去堆内存中开辟一 ...

  8. java中对象的创建过程

    public class Test1 { public static void main(String[] args) { new B(); System.out.println("---- ...

  9. java中的各种数据类型在内存中存储的方式

    原文地址:http://blog.csdn.net/aaa1117a8w5s6d/article/details/8251456 1.Java是如何管理内存的 java的内存管理就是对象的分配和释放问 ...

随机推荐

  1. node爬虫的几种简易实现方式

    说到爬虫大家可能会觉得很NB的东西,可以爬小电影,羞羞图,没错就是这样的.在node爬虫方面,我也是个新人,这篇文章主要是给大家分享几种实现node 爬虫的方式.第一种方式,采用node,js中的 s ...

  2. 循环 与 分支语句 和 字符函数库cctype 文件简单处理

    循环 for循环 while循环 do  while循环 通常,入口条件循环比出口条件循环好,因为循环开始前对条件进行检查 c++11基于范围的for循环    对数组(或容器类,如:vector和a ...

  3. python学习——文件操作

    打开文件 f = open(文件名, 文件打开模式,文件编码) ‘w’:只写模式,它是只能写,而不能读的.如果用’w’模式打开一个不存在的文件,则会创建新的文件开始写入:如果用’w’模式打开一个已存在 ...

  4. YARN底层基础库

      YARN基础库是其他一切模块的基础,它的设计直接决定了YARN的稳定性和扩展性,YARN借用了MRV1的一些底层基础库,比如RPC库等,但因为引入了很多新的软件设计方式,所以它的基础库更多,包括直 ...

  5. Python——面向对象编程

    面向对象编程是一种程序设计思想,把对象作为程序的基本单元,一个对象里面包含了数据以及操作数据的方法,称为类的属性和方法. 基础-定义.实例化.实例属性 用class来定义对象,类名首字母大写,如果这个 ...

  6. ASP.NET Core 2.2 : 二十七. JWT与用户授权(细化到Action)

    上一章分享了如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新,本章继续进行下一步,用户授权.涉及到的例子也以上一章的为基础.(ASP.NET Core 系列目录) 一.概述 ...

  7. 7.解决在python中用selenium启动FireFox浏览器启动不了的方法

    首次在利用python中的selenium启动FireFox浏览器时可能碰到如下问题 当输入如下代码时: from selenium import webdriver brower=webdriver ...

  8. P2774 方格取数问题 网络最大流 割

    P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...

  9. poj 1177 Picture(线段树周长并)

    题目链接:http://poj.org/problem?id=1177 题意:给你n个矩形问你重叠后外边缘总共多长. 周长并与面积并很像只不过是处理的时候是   增加的周长=abs(上一次的线段的长度 ...

  10. hdu5491 The Next 模拟

    Let LL denote the number of 1s in integer DD’s binary representation. Given two integers S1S1 and S2 ...