数据类型

Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress

引用类型包括:类类型,接口类型和数组。

堆与栈

堆和栈是程序运行的关键,很有必要把他们的关系说清楚。栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。第四,面向对象就是堆和栈的完美结合。其实,面向对象方式的程序与以前结构化的程序在执行上没有任何区别。但是,面向对象的引入,使得对待问题的思考方式发生了改变,而更接近于自然方式的思考。当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中。我们在编写对象的时候,其实即编写了数据结构,也编写的处理数据的逻辑。不得不承认,面向对象的设计,确实很美。在Java中,Main函数就是栈的起始点,也是程序的起始点。程序要运行总是有一个起点的。同C语言一样,java中的Main就是那个起点。无论什么java程序,找到main就找到了程序执行的入口:)堆中存什么?栈中存什么?堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处:))。为什么不把基本类型放堆中呢?因为其占用的空间一般是1~8个字节——需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况——长度固定,因此栈中存储就够了,如果把他存在堆中是没有什么意义的(还会浪费空间,后面说明)。可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。但是基本类型、对象引用和对象本身就有所区别了,因为一个是栈中的数据一个是堆中的数据。最常见的一个问题就是,Java中参数传递时的问题。Java中的参数传递时传值呢?还是传引用?要说明这个问题,先要明确两点:1. 不要试图与C进行类比,Java中没有指针的概念2. 程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传对象本身。明确以上两点后。Java在方法调用传递参数时,因为没有指针,所以它都是进行传值调用(这点可以参考C的传值调用)。因此,很多书里面都说Java是进行传值调用,这点没有问题,而且也简化的C中复杂性。但是传引用的错觉是如何造成的呢?在运行栈中,基本类型和引用的处理是一样的,都是传值,所以,如果是传引用的方法调用,也同时可以理解为“传引用值”的传值调用,即引用的处理跟基本类型是完全一样的。但是当进入被调用方法时,被传递的这个引用的值,被程序解释(或者查找)到堆中的对象,这个时候才对应到真正的对象。如果此时进行修改,修改的是引用对应的对象,而不是引用本身,即:修改的是堆中的数据。所以这个修改是可以保持的了。对象,从某种意义上说,是由基本类型组成的。可以把一个对象看作为一棵树,对象的属性如果还是对象,则还是一颗树(即非叶子节点),基本类型则为树的叶子节点。程序参数传递时,被传递的值本身都是不能进行修改的,但是,如果这个值是一个非叶子节点(即一个对象引用),则可以修改这个节点下面的所有内容。堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能。Java中,栈的大小通过-Xss来设置,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。常见的出现这个异常的是无法返回的递归,因为此时栈中保存的信息都是方法返回的记录点。

Java对象的大小

基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:

Object ob = new Object();

这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。

有了Object对象的大小,我们就可以计算其他对象的大小了。

Class NewObject {

int count;boolean flag;Object ob;

}

其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象的大小为24byte。这里需要注意一下基本类型的包装类型的大小。因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随便想下就知道了)。因此,可能的话应尽量少使用包装类。在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。

引用类型

对象引用类型分为强引用、软引用、弱引用和虚引用。

强引用:就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收

软引用:软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。

弱引用:弱引用与软引用类似,都是作为缓存来使用。但与软引用不同,弱引用在进行垃圾回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周期内。

强引用不用说,我们系统一般在使用时都是用的强引用。而“软引用”和“弱引用”比较少见。他们一般被作为缓存使用,而且一般是在内存大小比较受限的情况下做为缓存。因为如果内存足够大的话,可以直接使用强引用作为缓存即可,同时可控性更高。因而,他们常见的是被使用在桌面应用系统的缓存。

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
9V07uKOF5/8FWZuVTT/pbg==

JVM性能优化一些概念简介相关推荐

  1. JVM性能优化, Part 1 - JVM简介

    原文出自:http://www.importnew.com/1774.html 众所周知,Java应用程序是运行在JVM上的,但是你对JVM有所了解么?作为这个系列文章的第一篇,本文将对经典Java虚 ...

  2. JVM性能优化, Part 2 ―― 编译器

    2019独角兽企业重金招聘Python工程师标准>>> ImportNew注:本文是JVM性能优化 – 第2篇 <JVM性能优化, Part 2 ―― 编译器>第一篇 & ...

  3. 性能优化专题 - JVM 性能优化 - 04 - GC算法与调优

    目录导航 前言 Garbage Collect(垃圾回收) 如何确定一个对象是垃圾? 引用计数法 可达性分析 垃圾收集算法 标记-清除(Mark-Sweep) 复制(Copying) 标记-整理(Ma ...

  4. 【Java架构师】JVM性能优化(一)JVM技术入门下

    JVM性能和"一次编译,到处运行"的挑战 我有新的消息告诉那些固执的认为Java平台本质上是缓慢的人.当Java刚刚做为企业级应用的时候,JVM被诟病的Java性能问题已经是十几年 ...

  5. JVM性能优化之栈区域OOM问题

    本文来说下JVM性能优化之栈区域OOM问题 文章目录 概述 StackOverflowError异常 本文小结 概述 关于虚拟机栈和本地方法栈,分析内存异常类型可能存在以下两种: 如果现场请求的栈深度 ...

  6. JVM性能优化之CPU负载过高

    本文来说下JVM性能优化之CPU负载过高的问题 文章目录 概述 程序测试 问题定位 本文小结 概述 一般性结论:一般来说,CPU占用高不高的问题,不是给定一个数值,例如90%以上就算高,以下就算正常, ...

  7. JVM性能优化之堆区域OOM问题

    本文来说下JVM性能优化之OOM问题 文章目录 概述 堆溢出 堆溢出实践 本文小结 概述 常见内存溢出异常 在JVM内存区域中,除了程序计数器外,Java虚拟机的其他运行时区域都有可能发生OutOfM ...

  8. JVM性能优化, Part 5:Java的伸缩性

    感谢朋友[吴杰]投递本文. JVM性能优化系列文章由Eva Andearsson在javaworld上发表共计5篇文章,ImportNew上有前4篇译文.本文(第5篇)由吴杰翻译自:javaworld ...

  9. IDEA JVM 性能优化 相关参数设置

    文章目录 IDEA JVM 性能优化 相关参数设置 IDEA JVM 性能优化 相关参数设置 点击 Help - Edit Custom VM Options -Xms256m -Xmx2048m - ...

最新文章

  1. GitHub Draft Pull请求支持新的协作流程
  2. 本文把TCP/IP讲绝了!
  3. 电气论文:负荷区间预测(机器学习简单实现)
  4. Microsoft使用.NET Core SDK遥测数据
  5. Elasticsearch 5.2.x 使用 Head 插件连接不上集群
  6. Rainmeter后续——WIN10任务栏透明以及设置开机启动应用
  7. Python+tkinter实现文件拖放功能
  8. 男人最佳的生育年限,程序猿们,看看吧!!!
  9. IDEA自定义快捷键
  10. FTP服务器配置与管理(2) 创建FTP站点
  11. java 的.class 反编译软件
  12. Mac安装MySQL8碰到的问题
  13. Mac版PhotoShop 2020 最新版下载
  14. mysql 表 忽略大小写_mysql表名忽略大小写配置方法详解
  15. Java将Word转为图片完美解决方案(免费无损不乱码)
  16. Linux下PCB的task_struck结构体
  17. JAVA基于JSP的疫情学生宿舍管理系统【数据库设计、论文、源码、开题报告】
  18. C++字符串转为大写/小写
  19. Material Design(三)--暗色主题设计
  20. 一文解密 Netflix 的快速事件通知系统是如何工作的

热门文章

  1. Win7防火墙允许ping
  2. Simulink中的虚拟和非虚拟子系统
  3. 新电脑安装python环境
  4. 转载:挺住,意味着一切
  5. iOS app已经上架可供销售,但是在AppStore上搜不到的解决办法
  6. 618有哪些数码产品值得入手?盘点值得入的数码好物推荐
  7. 淘宝618列车/京东618叠蛋糕活动 自动领喵币/金币脚本
  8. java 邮件 客户端_JAVA编写ESMTP客户端发送邮件代码
  9. Python学习 Day28 JS函数(二)
  10. SQL Server无法连接到本地数据库