JVM

程序计数器:改变计数器的值来选取下一条执行的指令,不汇报OutOfMemoryError,线程私有。
虚拟机栈:线程私有,每个方法执行都会新建一这个栈帧:局部变量表,操作栈,动态链接,方法出口信息。
局部变量表内存空间在编译期分配,申请栈深度>允许的深度:StackOverflowError
当扩展时无法申请到足够的内存时会抛出OutOfMemoryError。-Xss控制大小。
本地方栈:与虚拟机栈一样,执行本地Native方法
堆:存放对象实例和数组,线程共享。
分为新生代,老年代。
Eden空间,From Survivor空间,To Survivor空间。
-Xmx -Xms 控制大小,当扩展时无法申请到足够的内存时会抛出OutOfMemoryError。
方法区:(永久代)线程共享,存放已被加载的类信息、常量、静态变量、即时编译期编译后的代码。
当扩展时无法申请到足够的内存时会抛出OutOfMemoryError。
运行常量池:存放编译期生成的各种字面量和符号引用。

对象访问:句柄:在java栈中reference中存放对象的句柄地址,句柄池(java堆)中存放句柄,
句柄中包含了对象实例数据和类型数据各自具体地址信息。稳定
直接指针:在java栈中reference中直接存放对象地址。速度快

java堆溢出:通过内存映像分析工具对dump出来的快照进行分析,
1、确认内存中的对象是否必要(分析是内存泄漏还是内存溢出)。
2、内存泄漏:查看到现楼对象GCRoots的引用链。定位泄漏代码的位置。
3、内存溢出:对象必须存活。检查虚拟机参数(-Xmx -Xms),
检查是否存在对象生命周期过长,持有状态时间过长,可减少程序运行期的内存消耗。

java栈溢出: 无论是栈帧太大还是虚拟机栈太小,当内存无法分配时会抛出StackOverflowError。

虚拟机内存=堆内存(Xmx)+方法区内存(MaxPermSize)+栈内存(Xss)

运行时常量池溢出:-XX:PermSize -XX:MaxPermSize控制大小,Exception提示信息 PermGen space。

方法去溢出:存放Class信息(类名、访问修饰符、常量池、字段描述、方法描述)

那些内存需要回收?
什么时候回收?
如何回收?

引用计数算法:给对象添加一引用计数器,被引用时+1,引用失效时-1,任何时候都为0,则判读已死。
不能解决对象之间相互循环引用。
根搜索算法:以GC Roots 对象为起点向下搜索,搜索所达的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,
则此对象已死。判断一个对象的死亡,至少经历两次标记过程。执行对象的finalize()可以有一次机会逃脱GC。
强引用:Object obj = new Object();
软引用:系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收。
弱引用:只能生存到下一次垃圾收集发生之前。
虚引用:

方法区回收:废弃的常量和无用的类。

垃圾回收算法:
标记-清除算法:
复制算法:把堆内存8:1:1分Eden:Survivor1:Survivor2,新生代使用Eden+Survivor1,回收时把Eden+Survivor1存活的对象
一次性的拷贝到Survivor2。
标记-整理算法:

垃圾收集器:G1:标记-整理算法,控制停顿。

内存分配:对象优先在Eden分配,大对象直接进入老年代。当Eden区没有足够的空间进行分配时,进行MinorGC。
长期存活的对象直接进入老年代。
回收策略:

类文件结构:Class以8位字节为基础

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值