程序存储的位置
1.寄存器
最快的存储区,它在处理器内部,寄存器是按照需求分配,无法直接控制。
2.堆栈
位于通用RAM中,可以通过堆栈指针来进行操作,指针向下移动,则分配新的内存,指针向上移动,则释放内存。速度仅次于寄存器。创建程序时,java必须知道在堆栈内所有项的生命周期,以便确定堆栈指针的上下移动,该约束限制了程序的灵活性,因此虽然某些数据(特别是对象的引用)存储在堆栈中,但java对象并不会存储在这里面。
注意:由于基本类型是特别小的、简单的变量,所以此类型变量不是用new来创建的,而是创建一个非引用的自动变量,该变量直接存储值,并置于堆栈中,所以更加高效。
3.堆
通用的内存池,也处于RAM中,可以存放所有的java对象。
存放在堆中的好处是:编译器不需要知道存储的数据在堆中存活多长时间,因此灵活性很大。当用new创建一个对象时,会自动在堆中进行存储分配。
4.常量存储
常量值由于不会改变,因此可以直接放在程序内部。
5.非RAM存储
数据完全存活在程序之外,则它可以不受程序控制,程序没有运行时也可以存在。
如流对象和持久化对象。流对象中,对象转化成字节流,通常被发送给另一台机器;持久化对象中,对象被存放在磁盘上,所以即使程序终止,它们仍可以保持自己的状态。
内存溢出和内存泄漏
内存溢出指程序在申请内存时,没有足够的内存空间供其使用,如申请了一个integer,但用它存储一个long才能存下的数,这就是内存溢出。
内存泄漏指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏的危害可以忽略,但如果该问题一直堆加,则内存到最后总会被消耗完。
详细解释:http://blog.csdn.net/buutterfly/article/details/6617375
JAVA中用于高精度计算的类
注意此时由于做运算需要以调用方法的方式来取代运算符方式,因此速度会变慢,是以牺牲速度来提高精度。
BigInteger
支持任意精度的整数
BigDecimal
支持任意精度的浮点数
---恢复内容结束---