0717-7821348
新闻中心

爱彩人彩票网手机版

您现在的位置: 首页 > 新闻中心 > 爱彩人彩票网手机版
爱彩人彩票网登录-Java虚拟机调优(一):Java的一些基本概念(上)
2019-05-31 22:46:06

数据类型

Java虚拟机中,数据类型能够分为两类:底子类型引证类型。底子类型的变量保存原始值,即:他代表的值便是数值自身;而引证类型的变量保存引证值。“引证值”代表了某爱彩人彩票网登录-Java虚拟机调优(一):Java的一些基本概念(上)个目标的引证,而不是目标自身,目标自身存放在这个引证值所表明的地址的方位。

底子类型包含:byte,short,int,long,char,float,double,Boolean,returnAddress

引证类型包含:类类型接口类型数组

堆与栈

堆和栈是程爱彩人彩票网登录-Java虚拟机调优(一):Java的一些基本概念(上)序运转的要害,很有必要把他们的联系说清楚。

栈是运转时的单位,而堆是存储的单位

栈处理程序的运转问题,即程序怎样履行,或许说怎样处理数据;堆处理的是数据存储的问题,即数据怎样放、放在哪儿。

在Java中一个线程就会相应有一个线程栈与之对应,这点很简单了解,由于不同的线程履行逻辑有所不同,因而需求一个独立的线程栈。而堆则是一切线程同享的。栈由于是运转单位,因而里边存储的信息都是跟当时线程(或程序)相关信息的。包含局部变量、程序运转状况、办法回来值等等;而堆只担任存储目标信息。

为什么要把堆和栈差异出来呢?栈中不是也能够存储数据吗

榜首,从软件规划的视点看,栈代表了处理逻辑,而堆代表了数据。这样分隔,使得处理逻辑更为明晰。分而治之的思维。这种阻隔、模块化的思维在软件规划的方方面面都有表现。

第二,堆与栈的别离,使得堆中的内容能够被多个栈同享(也能够了解为多个线程拜访同一个目标)。这种同享的收益是许多的。一方面这种同享供给了一种有用的数据交互办法(如:同享内存),另一方面,堆中的同享常量和缓存能够被一切栈拜访,节省了空间。

第三,栈由于运转时的需求,比方保存体系运转的上下文,需求进行地址段的区分。由于栈只能向上增加,因而就会限制住栈存储内容的才能。而堆不同,堆中的目标是能够根据需求动态增加的,因而栈和堆的拆分,使得动态增加成为可能,相应栈中只需记载堆中的一个地址即可。

第四,面向目标便是堆和栈的完美结合。其实,面向目标办法的程序与曾经结构化的程序在履行上没有任何差异。可是,面向目标的引进,使得对待问题的考虑办法发生了改动,而更接近于天然办法的考虑。当咱们把目标拆开,你会发现,目标的特点其实便是数据,存放在堆中;而目标的行为(办法),便是运转逻辑,放在栈中。咱们在编写目标的时分,其实即编写了数据结构,也编写的处理数据的逻辑。不得不供认,面向目标的规马薇薇划,的确很美。

在Java中,Main函数便是栈的起始点爱彩人彩票网登录-Java虚拟机调优(一):Java的一些基本概念(上),也是程序的起始点

程序要运转总是有一个起点的。同C言语相同,java中的Main便是那个起点。无论什么java程序,找到main就找到了程序履行的进口:)

堆中存什么?栈中存什么

堆中存的是目标。栈中存的是底子数据类型和堆中目标的引证。一个目标的巨细是不行估量的,或许说是能够动态改变的,可是在栈中,一个目标只对应了一个4btye的引证(仓库别离的优点:))。

为什么不把底子类型放堆中呢?由于其占用的空间一般是1~8个字节——需求空间比较少,并且由于是底子类型,所以不会呈现动态增加的状况——长度固定,因而栈中存储就够了,假如把他存在堆中是没有什么含义的(还会糟蹋空间,后边阐明)。能够这么说,底子类型和目标的引证都是存放在栈中,并且都是几个字节的一个数,因而在程序运转时,他们的处理办法是一致的。可是底子类型、目标引证和目标自身就有所差异了,由于一个是栈中的数据一个是堆中的数据。最常见的一个问题便是,Java中参数传递时的问题。

Java中的参数传递时传值呢?仍是传引证

要阐明这个问题,先要清晰两点:

1. 不要企图与C进行类比,Java中没有指针的概念

2. 程序运转永远都是在栈中进行的,因而参数传递时,只存在传递底子爱彩人彩票网登录-Java虚拟机调优(一):Java的一些基本概念(上)类型和目标引证的问题。不会直接传目标自身。

清晰以上两点后。Java在办法调用传递参数时,由于没有指针,所以它都是进行传值调用(这点能够参阅C的传值调用)。因而,许多书里边都说Java是进行传值调用,这点没有问题,并且也简化的C中复杂性。

可是传引证的幻觉是怎样形成的呢?在运转栈中,底子类型和引证的处理是相同的,都是传值,所以,假如是传引证的办法调用,也一起能够了解为“传引证值”的传值调用,即引证的处理跟底子类型是彻底相同的。可是当进入被调用办法时,被传递的这个引证的值,被程序解说(或许查找)到堆中的目标,这个时分才对应到真实的目标。假如此刻进行修正,修正的是引证对应的目标,而不是引证自身,即:修正的是堆中的数据。所以这个修正是能够坚持的了。

目标,从某种含义上说,是由底子类型组成的。能够把一个目标看作为一棵树,目标的特点假如仍是目标,则仍是一颗树(即非叶子节点),底子类型则为树的叶子节点。程序参数传递时,被传递的值自身都是不能进行修正的,可是,假如这个值是一个非叶子节点(即一个目标引证),则能够修正这个节点下面的一切内容。

堆和栈中,栈是程序运转最底子的东西。程序运转能够没有堆,可是不能没有栈。而堆是为栈进行数据存储服务,说白了堆便是一块同享的内存。不过,正是由于堆和栈的别离的思维,才使得Java的废物收回成为可能。

Java中,栈的巨细经过-Xss来设置,当栈中存储数据比较多时,需求恰当调大这个值,不然会呈现java.lang.Stack爱彩人彩票网登录-Java虚拟机调优(一):Java的一些基本概念(上)OverflowError反常。常见的呈现这个反常的是无法回来的递归,由于此刻栈中保存的信息都是办法回来的记载点。

有想深化了解JVM的读者能够重视小编,私信:java虚拟机 要害字获取学习材料.

本文转载于CSDN 和你在一起的博客

原文:https://pengji爱彩人彩票网登录-Java虚拟机调优(一):Java的一些基本概念(上)aheng.iteye.com/blog/518623