探索JVM

从今天起,算是给自己一个约束吧..坚持每周必要写一篇技术文章,养成一个习惯,时间久了就能形成知识体系。

今天来对JVM内存分配及JAVA内存回收、OOM异常等知识点做下复习

1) JAVA 内存分配
java内存分为六大类,堆、栈、寄存器、静态域、常量池、非RAM,这里主要介绍的是堆和栈。

JAVA每个线程都会有相对应的栈来维持其运作,JDK1.5以前默认的栈空间是256KB,现在默认的空间是1MB,当用户像web应用服务器发送请求的时候,tomcat会从线程池中拿出一个线程相应用户请求,相对应的此线程也会到JVM中申请栈空间。这里要声明下,[b][color=red]线程不是与“用户”绑定,而是与“请求”绑定[/color][/b],举个简单的实例,用户发送请求的时候,如果与请求相对应的线程没有执行完,即使Session过期,此线程也会继续执行。

JAVA堆内存是JVM进程中唯一的,分为新生区、幸存区、养老区、永久存储区、初始分配内存时候,对象放在新生区中,JVM会把不经常引用的内存移至到伊甸区,最后把部分移至到养老区,当类运行的时候,JAVA会把类信息移至到永久存储区,普通GC不会回收永久存储区对象。

静态变量会放在方法区中、实例变量会放在堆中,相对应引用会放在不同的栈中,只有当运行的时候才会对类变量进行内存分配。

2) javaGC

javaGC分为普通GC和FULL GC,普通GC时间比较短,会回收新生区、幸存区、FULL GC会移除堆中所有空间的未引用对象,JVM GC的时候会停止对外“服务”,因此减少GC的时间也是JVM优化的“点”之一,JVM有不同的回收器。不同的回收算法以后我会研究,这里待续。

3)OOM异常总结

Java heap space java堆溢出
PermGen space 方法区溢出或者常量池溢出
unable to create new native 线程太多溢出
StackOverflowError 栈空间不够溢出

相对应的溢出方式我们有相对应的调节方法,在工作中如果发现OOM问题,要以解决问题优先,其次是经验总结,把问题记录下来长久下来形成知识体系~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值