JVM一次实践

来源:互联网 发布:vscode拆分成两栏 编辑:程序博客网 时间:2024/06/09 15:36
1、栈区(stack segment)
  由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放内存资源 
2、堆区(heap segment)
  一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收 
3、静态区(data segment)
  存放全局变量,静态变量和字符串常量,不释放 
4、代码区(code segment)

  存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域  

  java堆由Perm区和Heap区组成,Heap区则由Old区和New区组成,而New区又分为Eden区, From区, To区,Heap = {Old + NEW = { Eden, From, To } }

URL被访问时,内存申请过程如下:

 
A. JVM会试图为相关Java对象在Eden中初始化一块内存区域 
B. Eden空间足够时,内存申请结束。否则到下一步 
C. JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区 
D. Survivor区被用来作为EdenOLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区 
E. OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级) 
F. 完全垃圾收集后,若SurvivorOLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"out of memory错误

java.lang.OutOfMemoryError:PermGenspace 

JVM管理两种类型的内 存,堆和非堆。堆是给开发人员用的,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。

jps(Java Virtual Machine Process Status Tool)JDK1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。 


JMAP Java Memory Map


jmap –heap pid
Jmap –histo pid >c:/jmap.txt


===============================================
1、Java中可以在堆(heap)中申请内存,但是没有手动的释放内存机制,采用的是GC(Java垃圾回收机制),
但是实现或继承Collection的类,在new对象之后,到所使用它的函数运行结束,才会进行内存回收。


2、调查方法及工具
工具的位置C:\Program Files\Java\jdk1.6.0_31\bin下
(1)jps(查看JVM中进程信息——包含进程号--------Bootstrap名称的是启动的tomcat)
(2)jconsole(可以关联一个指定的进程,进行垃圾回收,查看内存占用情况,选择对应的Bootstrap进程)
(3)jmap -heap pid(指定进程的,查看内存配置及使用情况)
     jmap -histo pid(tomcat进程的pid,查看该服务中实例化类的个数)
     jmap -histo pid > C:\mem.txt      输出结果定向到C盘的mem.txt中


 

原创粉丝点击