java jvm是什么_java:JVM及相关概念

public class TestDemo{


public static void main(String args[]){


String str = null;


str.length();


}


}


上面程序会报空指针异常,如下图,在报的这个异常中,有一行日志 at TestDemo,main(TestDemo.java:4) 代表程序运行到TestDemo 中main()函数第四行的时候发生的错误,就是通过程序计数器来记录这个程序运行的位置的。



3.5 本地方法栈


和虚拟机栈类似,不过本地方法栈里面运行的方法不是用java写的,一般是用c或c++写的为虚拟机使用到Native方法服务,也有类似栈帧的的概念。



用一张图描绘每个区域存储的内容


4、内存模型和垃圾回收


正式阅读之前需要了解相关概念:Java 堆内存分为新生代和老年代,新生代中又分为1个 Eden 区域 和 2个 Survivor 区域。


4.1 概述


jvm?中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。



4.2 GC的对象


需要进行回收的对象就是已经没有存活的对象,判断一个对象是否存活有两种方法:引用计数和可达性分析


引用计数:每一个对象都有一个引用计数属性,新增一个引用时计数增加1,释放引用时计数减1。计数为0时可以回收。此方法简单,但无法解决对象互相引用的问题。



从上图中可以看出,如果不小心把Obj1-reference 和 Obj2-reference置null。则在java堆中的两块内存依然保持互相引用无法回收。


可达性分析:从GC Root开始向下搜索,搜索所走过的路径称之为引用链。当一个对象到GC Root没有任何引用链相连时,则证明此对象不可用,不可达对象。



可作为 GC Roots 的对象:


虚拟机栈(栈帧中的本地变量表)中引用的对象


方法区中类静态属性引用的对象


方法区中常量引用的对象


本地方法栈中 JNI(即一般说的 Native 方法) 引用的对象


4.3 什么时候触发GC


1.程序调用System.gc时可触发


2.系统自身决定触发GC的时机(根据Eden和From?Space区的内存大小来决定。当内存大小不足时,则会启动GC线程并停止应用线程)


GC又分为Minor gc和Full gc


Minor gc:当Eden区满是触发,Minor gc


Full gc:


a.调用System.gc时,系统建议执行Full GC,但是不必然执行


b.老年代空间不足


c.方法区空间不足


d.通过Minor GC后进入老年代的*均大小大于老年代的可用内存


e.由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小


GC主要做了清理对象,整理内存的工作。Java堆分为新生代和老年代,采用了不同的回收方式。(回收方式即回收算法详见后文)


4.3.1 回收方法区:


在堆中,尤其是在年轻代中,一次垃圾回收一般可以回收 70% ~ 95% 的空间,而永久代的垃圾收集效率远低于此。永久代垃圾回收主要两部分内容:废弃的常量和无用的类。


判断废弃常量:一般是判断没有该常量的引用。


判断无用的类:要以下三个条件都满足


该类所有的实例都已经回收,也就是 Java 堆中不存在该类的任何实例


加载该类的 ClassLoader 已经被回收


该类对应的 java.lang.Class 对象没有任何地方呗引用,无法在任何地方通过反射访问该类的方法


4.4 GC算法


GC常用算法有:标记-清除算法,标记-压缩算法,复制算法,分代收集算法。


目前主流的JVM(HotSpot)采用的是分代收集算法。


分代收集算法


现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代(Young)和老年代(Tenure)。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理?或者?标记-清除。


具体过程:新生代(Young)分为Eden区,From区与To区



当系统创建一个对象的时候,总是在Eden区操作,当这个区满了,那么就会触发一次YoungGC,也就是年轻代的垃圾回收。一般来说这时候不是所有的对象都没用了,所以就会把还能用的对象复制到From区。



这样整个Eden区就被清理干净了,可以继续创建新的对象,当Eden区再次被用完,就再触发一次YoungGC,然后呢,注意,这个时候跟刚才稍稍有点区别。这次触发YoungGC后,会将Eden区与From区还在被使用的对象复制到To区,



再下一次YoungGC的时候,则是将Eden区与To区中的还在被使用的对象复制到From区。



经过若干次YoungGC后,有些对象在From与To之间来回游荡,这时候From区与To区亮出了底线(阈值),这些家伙要是到现在还没挂掉,对不起,一起滚到(复制)老年代吧。



老年代经过这么几次折腾,也就扛不住了(空间被用完),好,那就来次集体大扫除(Full GC),也就是全量回收。如果Full GC使用太频繁的话,无疑会对系统性能产生很大的影响。所以要合理设置年轻代与老年代的大小,尽量减少Full GC的操作。


参考:

相关文档

  • 小学生一年级自我介绍作文
  • 五年Java程序员终于完成了月入三万的目标,这是给我520最好礼物,辛苦了从前的自己
  • 验证完全二叉树
  • 紫藤怎么移植
  • 十二月去哈尔滨有什么好玩的么
  • dubbo-admin打包war包问题,dubbo-admin版本与jdk不兼容
  • 西红柿减肥食谱有哪些
  • 事业单位人员入党思想汇报
  • 联想手机通讯录停止运行怎么办
  • 《Kafka实战》之consumer的使用和手动管理offset
  • 自讨没趣的歇后语
  • 上半年个人工作总结最新3篇
  • 数组 之 你值得了解的底层
  • 微信视频对方看不见我是什么原因
  • 谈目前SEO资料的时效性、正确性与实用性
  • 魅族手机桌面设置没了
  • 吃早餐的误区有哪些
  • sql两数相除保留两位小数_五年级 小数除法练习题
  • 精选小学的感受作文500字五篇
  • 怎么把单位的社保转移
  • ORB-SLAM2-ORB相关
  • 党建党风廉政工作总结精选多篇
  • 16+8轻断食可以天天用吗 16+8轻断食一周几次
  • 化纤是什么材质有毒吗
  • 在共同生活和共同劳动劳动,让生活更美丽国旗下讲话稿
  • 中医穿对颜色养五脏 金型人不宜穿红色
  • 阿司匹林肠溶片和硫酸氢氯吡格雷片治疗急性脑梗死的疗效 硫酸氢氯吡格雷片联合阿司匹林治疗不稳定型心绞痛的研究
  • 教师个人事迹介绍
  • 胆固醇高吃什么肉 推荐9种肉类
  • 伤感心情经典语录句子
  • 电脑版