网络笔记—java内存与虚拟内存

本文详细介绍了Java程序运行时的六种数据存储区域,包括寄存器、栈、堆、静态存储、常数存储和非RAM存储。重点讨论了堆内存的管理与垃圾回收机制,提供了减少垃圾回收频率及优化应用性能的经验法则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Quotes:http://www.alisdn.com/wordpress/?p=776

 

Java程序运行时,有6个地方可以用于保存数据:

(1) 寄存器。最快的保存区域,位于处理器内部,数量十分有限,它是根据需要由编译器分配。我们对此没有直接的控制权.

(2) (stack)。驻留于常规RAM(随机访问存储器)区域,这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的长度以及存在时间。这失去了一定的灵活性,因此对象句柄是存放在栈中,但Java对象并不放到其中。

(3) (heap)。保存了Java对象。和栈不同,它最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!

(4) 静态存储。这儿的静态Static)是指位于固定位置(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。

(5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。

(6) RAM存储。数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。

 

Heap设定与垃圾回收Heap分为3个区,YoungOldPermanentYoung保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象。JVMHeap分配可以使用-X参数设定,

 

-Xms   初始Heap大小

-Xmx   java heap最大值

-Xmn   young generationheap大小

 

JVM2GC线程。第一个线程负责回收HeapYoung区。第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。

 

为什么一些程序频繁发生GC?有如下原因:

程序内调用了System.gc()Runtime.gc()

一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC

JavaHeap太小,一般默认的Heap值都很小。

频繁实例化对象,Release对象。

 

1ServerJVM最好将-Xms-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx1/3[2]

2.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。

3Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。

4Stack的设定

每个线程都有他自己的Stack

-Xss       每个线程的Stack大小

Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小。如果Stack太小,也会导致Stack溢漏。

 

JAVA程序内存管理的一些经验:

      根据JVM内存管理的工作原理,可以通过一些技巧和方式让JVMGC处理时更加有效.,从而提高内存使用和缩短GC的执行时间.

      1,尽早释放无用对象的引用.即在不使用对象的引用后设置为空,可以加速GC的工作.(当然如果是返回值…..)

      2,尽量少用finalize函数,此函数是JAVA给程序员提供的一个释放对象或资源的机会,但是却会加大GC工作量.

      4,注意集合数据类型的数据结构,往往数据结构越复杂,GC工作量更大,处理更复杂.

      5,尽量避免在默认构造器(构造函数)中创建,初始化大量的对象.

      6,尽量避免强制系统做垃圾回收.会增加系统做垃圾回收的最终时间降低性能.

      7,尽量避免显式申请数组,如果不得不申请数组的话,要尽量准确估算数组大小.

      8,如果在做远程方法调用.要尽量减少传递的对象大小.或者使用瞬间值避免不必要数据的传递.

      9,尽量在合适的情况下使用对象池来提高系统性能减少内存开销,当然,对象池不能过于庞大,会适得其反

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值