浅析JVM及其调优(一)

来源:互联网 发布:php 提示非法字符串 编辑:程序博客网 时间:2024/05/22 13:18

数据类型

 众说周知,JAVA的数据类型,可以分为基本类型和引用类型。基本类型就是数值的本身,引用类型表示对象的引用,而不是对象的本身,对象的本身存放在引用值所表示的内存地址的位置上。

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

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

堆与栈


栈是程序运行时单位,解决程序如何执行,即如何处理数据。

堆是数据存储单位,解决数据怎么存,存在哪。

在JAVA中一个线程对象一个栈,而所有的线程共享一个堆。栈是运行单位,因此里面存储的信息都和当前线程(当前程序)相关的信息,包括局部变量、程序运行状态、方法返回值等等。而堆只负责存储对象信息。

为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?

第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。体现了隔离、模块化的思想。

第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。

第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。

堆中存什么?栈中存什么?

堆中存储对象,栈中存储基本类型和对象的引用。

因为一个对象的大小是动态了,而栈中,一个对象只对应一个4byte的引用。而基本类型数据一般只占1-8byte且长度固定,所以和对象引用存储在栈中。

Java中的参数传递时传值呢?还是传引用?

Java程序始终的在栈中执行的,参数传递,只会传递基本类型值和对象的引用值,不会直接传递对象本身,所以参数传递只是值传递。

对象可以认为其是由基本类型组成的。可以把一个对象看作为一棵树,对象的属性如果还是对象,则还是一颗树(即非叶子节点),基本类型则为树的叶子节点。程序参数传递时,被传递的值本身都是不能进行修改的,但是,如果这个值是一个非叶子节点(即一个对象引用),则可以修改这个节点下面的所有内容。

堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能。

Java中,栈的大小通过-Xss来设置,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。常见的出现这个异常的是无法返回的递归,因为此时栈中保存的信息都是方法返回的记录点。


0 0
原创粉丝点击