JVM内存学习

转帖

http://blog.csdn.net/cutesource/article/details/5904501

 

http://sesame.iteye.com

 

买本 java jvm的书

 

/blog/353242

jvm 内存图

 

 

java 内存:
堆,方法区(这2个是线程共享的,会出现线程不安全的问题)
栈,pc,本地方法区(线程独享不会出现安全问题)
 
static int i =10 ;在 方法区中。
 
线程部分
线程池的最大多少和最小多少的区别?
 
线程池解决了java创建线程和销毁线程所浪费的时间。
多个线程池的坏处?
 

线程用方法区的时候,只是复制一份,到自己的栈帧里,用完以后,再同步回去。

Java stack以帧为单位保存线程的运行状态。

每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。所以一个方法被多个线程执行的时候,临时变量、参数和中间结果不用考虑同步问题。

 

Heap
Java程序在运行时创建的所有类实或数组都放在同一个堆中。而一个Java虚拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个java程序独占一个JVM实例,因而每个java程序都有它自己的堆空间,它们不会彼此干扰。但是同一java程序的多个线程都共享着同一个堆空间,就得考虑多线程访问对象(堆数据)的同步问题。 (这里可能出现的异常java.lang.OutOfMemoryError: Java heap space)

 

Program counter
每个运行中的Java程序,每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿“地址”,这里的“地址”可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

 

内存优化:

在Java垃圾收集机制中的Minor GC和Full GC分别指什么,有和不同?
答:Minor GC是指新生代GC,是发生在新生代的垃圾收集动作,因为Java对象大多都具有“朝生夕灭”的特性,所以Minor GC非常频繁,一般回收速度也比较快;Full GC(也称为Major GC)是指老年代的GC,Full GC的速度一般会比Minor GC慢10倍以上。


相关知识扩展:虚拟机一般提供参数-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在发生垃圾收集行为时打印内存回收日志,并且在进程退出的时候输出当前内存各区域的分配情况。在实际应用中,内存回收日志一般是打印到文件后通过日志工具进行分析。

 

对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。

j2me游戏loading的过程必然需要进行次Full GC。

 

 

 

 

 

 

posted @ 2013-03-19 15:11  无尽之宇  阅读(189)  评论(0编辑  收藏  举报