关于JVM个人浅谈(三)

在上一篇中,大致讲述了GC回收的算法,接下来就在本篇文章里介绍一下如何去预估Java对象的大小,以便后续再优化JVM提供数据理论基础。

一个普通对象的内存大小如下:

1._mark对象头 占用8byte;

2.oop指针,默认占用4byte;

3.数据区 具体根据对象属性而定;

4.padding,内存对齐(如果不懂,可以看看计算机组成原理 这本书 大学计算机系必修之一) Java以8的倍数对齐

一个普通的数组内存大小如下:

1._mark对象头 占用8byte

2.oop指针,默认占用4byte

3.数组长度,占用4byte

4.数据区 具体数组对象大小而定

5.padding,内存对齐 也是以8的倍数

下面我们举个例子:

package com.object.test;

public class ObjectSize {

	private String	b;	// 4byte;
	private int     a;      // 4byte;
	private short	c;	// 2byte;
	private Object	d;	// 4byte;

}

这样一来该对象的大小等于(这里需要注意的是 内存排序方式是从长到短,引用最后):

总大小是: 8(mask)+4(oop)+4(a)+2(b)+2(padding)+4(b)+4(padding)=28;

这样一个对象占用了28个byte。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 01:07:40

关于JVM个人浅谈(三)的相关文章

Servlet浅谈(三)

一.三种作用域 作用域:web开发中用于存储和获得数据. 1.request 一次请求有效,在forward跳转时可用request作用域传递数据. 2.session client不变,session不变.用于标记用户状态.存储用户数据.验证码.购物车等. 3.ServletContext web应用不变,ServletContext不变,ServletContext代表的是整个web应用.一般用于储存全web单例的重量级资源. ServletContext对象通过session获得,Serv

关于JVM个人浅谈(一)

Java虚拟机是Java程序运行的基础,也是深入理解java的必备知识. 首先JVM的内存分布主要有:程序计数器,虚拟机栈,本地方法栈,Java堆,方法区.其中标红的表示相对更重要. 1)程序计数器 程序计数器是一块很小的内存,是每一块线程的私有空间,主要负责为每一个线程记录下一条需要运行的指令.如果当前线程正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址,如果电器一个线程正在执行一个Native方法,则程序计数器为空. 2)Java虚拟机栈 Java虚拟机栈是线程的私有空

jvm 原理浅谈

jvm 包含了堆栈区.方法区等存储区域.类装载子系统以及执行引擎. jvm执行流程:编译(字节码)-->类装载(加入内存)-->类执行(分配内存执行) jvm 内存机制:堆内存(new出来的所有对象)    栈内存(基础数据类型.形参.new对象的引用) 静态方法区(方法代码.final常量.静态变量) 本地方法栈 类被装载后执行前,会进行链接即初始化,初始化一些方法,先初始化默认值,然后静态初始化函数和静态域的初始化构造方法的执行!

浅谈“三次握手与四次挥手”

之前在张神的QQ群里偶尔间聊到了关于这个的问题,我这里写一下我所认知的三次握手&四次挥手,若有错误之处,请路过的大佬们指正. 首先简单的科普一下什么是三次握手,什么是四次挥手. 1.三次握手: C-->S:[SYN]   在么                                                                syn:synchronization(同步) S-->C:[SYN,ACK]   在                        

关于JVM个人浅谈(二)

在上一章,我们了解Java虚拟机的分布以及各个部分的主要存储内容,下面将介绍GC的长用回收算法. 1.引用计数法: 引用计数法是比较古老的一种垃圾回收算法.主要实现就是当任何一个对象引用A对象的时候,则在A对象的计数器上加1,如果引用失效的时候,则将A的计数器减1,如果对象A的引用计数器为0,则回收该对象的内存空间.这种方式虽然简单,但是存在不足,就是当A对象引用B对象,B对象又引用A对象,这样,A与B对象的计数器一直都是1,产生死锁,引起内存泄漏. 2.标记-清除法 在Java堆内存中从根节点

浅谈 产品经理、研发、测试,三个冤家如何高效沟通

浅谈 产品经理.研发.测试,三个冤家的那点事(1) 算上实习时间,参加工作已经五年了,一直在从事软件开发和测试的工作,期间也兼职干过一部分产品经理的事情,对这三者之间的微妙关系,颇有感悟. 1. 先来解读一下这三个岗位的"痛点" 聚会的时候,经常碰到以下几种情况,事后想起来,经常会有逗乐的感脚. 做开发的GG们是这样的: 一聊到自己的项目,两眼开始冒光,同时开启了狂喷模式,blabla一堆高大上的专业术语,一方面骂测试人员不懂技术,提的bug根本就不是关键问题,高级的bug他们根本就发

浅谈Kotlin(三):类

浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 前言: 已经学习了前两篇文章,对Kotlin有了一个基本的认识,往后的文章开始深入介绍Kotlin的实战使用. 本篇介绍Kotlin中类的使用. 一.表现形式 首先看一段Java中定义类的形式,定义三个属性,每一个属性对应一个get.set方法,有一个toString()方法 /* * @author xqx * @emil [email protected] * create

浅谈单例的三种实现--C#

传统的double check : public sealed class Singleton { private static Singleton instance = null; private static readonly object padlock = new object(); Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (padlock) { if (i

浅谈DevExpress<三>:在GridView中加载动态图片

今天的演示效果如下:在GridView中的下拉框中选中一种颜色,则后面的加载相应的图片,如下图: 1. 2. 3. 下面说下实现方法:首先在项目中拉一个GirdControl,在里面创建4列:ID,Name,Color,Image,并将Color和Image分别创建repositoryItemComboBox和repositoryItemPictureEdit控件,如下图: 将一个图片文件夹放到程序的启动目录中: 文件夹中包含如下图片: 接下来进行创建数据模板,先创建一个Datetable,添加