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的内存管理就是对象的分配和释放问 ...
随机推荐
- 常用加密解密算法【RSA、AES、DES、MD5】介绍和使用
内容不转载了,加上链接https://blog.csdn.net/u013565368/article/details/53081195?_t=t
- 单元测试之NUnit一
NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 NUnit是什么? N ...
- java四种引用及在LeakCanery中应用
java 四种引用 Java4种引用的级别由高到低依次为: StrongReference > SoftReference > WeakReference > PhantomRefe ...
- 猫眼电影和电影天堂数据csv和mysql存储
字符串常用方法 # 去掉左右空格 'hello world'.strip() # 'hello world' # 按指定字符切割 'hello world'.split(' ') # ['hello' ...
- Mysql分区实战
一,什么是数据库分区 前段时间写过一篇关于MySQL分表的的文章,下面来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面 ...
- python控制窗口口字形运动
import win32con import win32gui import time import math notepad = win32gui.FindWindow("Photo_Li ...
- CF985B Switches and Lamps 思维 第十九
Switches and Lamps time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #409 C. Voltage Keepsake(二分+思维)
题目链接:http://codeforces.com/contest/801/problem/C 题意:给出一个充电器每秒钟充p个点,还有n个电器要同时使用a[i]表示第i个电器每秒钟用多少点,b[i ...
- 数论 线性同余方程的应用 poj2891
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 17321 ...
- 如何配置nginx和tomcat实现反向代理?
什么是反向代理 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务 ...