前言

之前对JVM的了解纯限于面经,或是牛客选择题后的解析。现在开始正式修炼,修炼!!


第一部分:走进Java

原来Java虚拟机上可以运行很多其他语言。Java平台的多语言混合编程成为主流。
JDK1.5加入了java.util.concurrent包
JDK1.7加入了forkjoin包,Fork/Join模式能解决不少并发问题。

64位虚拟机的运行比32位的落后约15%。但企业对64位虚拟机的需求是非常迫切的。JDK1.6 Update14后,提供了普通对象指针压缩功能,在解释器解释字节码时,植入压缩指令以节省内存消耗。

Open JDK是Sun JDK的开源版本。
我们使用Open JDK一探JDK内部的实现机制。

cygWin的安装只说一点是:默认安装缺少部分我们想要的包,要通过搜索包,然后先按分类找,可能会有包不在所给分类的状况,我们就去其他分类对照描述来选择包,点击切换skip的箭头,既是选择。

Too young too simple


第二部分:自动内存管理机制

正是因为Java程序员把一切内存控制权力交给虚拟机,一旦出现内存泄漏和溢出,如果不了解虚拟机是怎样使用内存的,排查错误会成为一项艰难的工作。

  • 方法区Method Area——VM Stack虚拟机栈 Native Method Stack本地方法栈
  • 堆Heap——————— Counter程序计数器
  • 执行引擎 ————–》 本地库接口——》本地方法库

2.2.1 程序计数器
为了线程切换后能恢复到正确的执行位置存在
字节码解释器通过改变这个计数器的值选取下一条需要执行的字节码指令
每个线程都有一个独立的程序计数器,各独立存储,这类内存区域叫线程私有的内存。
如果线程正在执行Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;
如果线程在执行Native方法,这个计数器值则为空,此内存区域唯一没有规定OutOfMemoryError的区域。


2.2.2 Java虚拟机栈
线程私有,生命周期和线程相同。虚拟机栈描述的是Java方法执行的内存模型。
每个方法执行都会创建栈帧,存储局部变量表,操作栈,方法出口等。局部变量表所需空间在编译期分配
每个方法被调用直至完成的过程,对应着一个栈帧在VM stack从入栈到出栈的过程。
线程请求的栈深度大于VM允许的深度,将抛出StackOverFlow异常,VM扩展时无法申请到足够内存,抛出OutOfMemory异常。


2.2.3 本地方法栈
Native method stack为虚拟机使用的Native方法服务。本地方法栈中的方法,具体的虚拟机可自由实现。


2.2.4 Java堆
Java堆是被所有线程共享的内存区域,在虚拟机启动时创建。所有的对象实例和数组都要在堆上分配。也是垃圾收集器管理的主要区域。Java堆可以处于物理不连续的内存空间中。
2.2.5 方法区
方法区和堆,都是线程共享的区域。存储已被虚拟机加载的类信息,常量,静态变量,编译后的代码。为堆的逻辑部分。和堆一样不需要连续的内存和可以选择固定大小或者可扩展外,可以不实现垃圾收集。这个区域回收主要是针对常量池的回收和对类型的卸载。


2.2.7 直接内存
直接内存用不好也导致OutOfMemory的出现。JDK1.4加入了NIO类。这是基于Channel和Buffer的I/O方式。可以使用Native函数类直接分配堆外内存。通过堆中的DirectByteBuffer对象作为这块内存的引用进行操作。避免了Java堆和Native堆中来回复制数据。


2.3对象访问
O o=new O();
前者作为引用类型出现,反映到Java栈的本地变量表中,后者反映到Java堆中。Java堆中还必须包含能察州道此对象类型数据(对象类型、父类、实现的接口、方法等)的地址信息。
引用访问对象,主流的访问方式有两种:使用句柄和直接指针。

如果使用句柄访问,Java堆中会划分一块内存作为句柄池,引用中存储的是对象的句柄地址。句柄中包含了对象实例数据和类型数据(方法区)各自的具体地址信息。
如果使用直接指针访问,必须考虑如何放置访问类型数据的相关信息。(只有类型数据指针,少一个到对象实例数据的指针)
句柄访问好处是:在对象被移动时,只会改变句柄中的“实例数据”指针,引用本身不被修改。

使用指针访问好处:速度更快,节省了指针定位的时间开销,Sun HotSpot而言,使用这种。
在单线程下,无论是栈帧太大还是VM栈容量太小,内存无法分配时,虚拟机抛出都是stackoverflow异常。

每个线程分到的栈容量越大,可以建立的线程数量就越少。如果是建立过多线程导致的内存溢出,通过减少最大堆和减少栈容量获取更多的线程。

2.4.3常量池溢出
outofMemory后面跟permgen space,说明运行时常量池属于方法区

2.4.4方法区溢出
cglib是字节码技术,增强的类越多,需要越大的方法区保证动态生成的class加载入内存。

2.4.5本机直接内存溢出
使用DirectByteBuffer,unsafe.allocateMemory()分配内存会抛出内存溢出异常。

《深入理解Java虚拟机》第1,2章相关推荐

  1. 《Docker技术从入门到实践》第3,4,5章(三大概念)

    第3章 镜像 获取镜像 docker pull ubuntu 14.10 查看镜像信息:docker images 增加新的镜像标签:docker tag 获取镜像详细信息:docker inspec ...

  2. 《Docker技术从入门到实践》第1,2章

    第一章 初识Docker Docker是基于GO语言实现的云开源项目. Docker的主要目标是通过对应用组件的封装,分发,部署,运行达成"一次封装,处处运行". 这里的应用组件可 ...

  3. 《Python网络爬虫——从入门到实践》第六章将数据存储至MySQL数据库的学习心得与总结(出错与纠正方法)

    <Python网络爬虫--从入门到实践>第六章将数据存储至MySQL数据库的学习心得与总结(出错与纠正方法) 作为刚开始入门python的小白,对大数据,网络爬虫比较感兴趣.完全是自我修炼 ...

  4. 《Python编程:从入门到实践》第七章练习题

    <Python编程:从入门到实践>第七章练习题 <Python编程:从入门到实践>第七章练习题 7-1 汽车租赁 7-2 餐馆订位 7-3 10的整数倍 7-4 比萨配料 7- ...

  5. 区块链技术从入门到实践

    内容简介 经过多年的发展和演变,区块链被公认为下一代互联网,已经成为创业创新的最热门领域之一.同时,国内区块链 + 实体经济成为大势所趋,大量企业正在探索区块链应用之道.在此背景下,区块链也成为技术人 ...

  6. 深度学习框架PyTorch入门与实践:第七章 AI插画师:生成对抗网络

    生成对抗网络(Generative Adversarial Net,GAN)是近年来深度学习中一个十分热门的方向,卷积网络之父.深度学习元老级人物LeCun Yan就曾说过"GAN is t ...

  7. Python编程入门到实践 - 笔记( 4 章)

    昨天下午又看了一遍第4章,今天早上自己来个总结吧. 复习内容如下: 通过 for 循环遍历表中内容以及在循环中打印和循环外打印 rang() 创建列表和设置步长 数字列表的简单统计 1)mix 最小 ...

  8. python编程15讲答案,[Python编程:从入门到实践] 第十五章:生成数据 习题答案

    Python 小白提交答案,有不足请老鸟们指点,谢谢~ 15-8 同时投掷三个骰子:如果你同时掷三个D6骰子,可能得到的最小点数为3,而最大点数为18,.请通过可视化展示同时掷三个D6骰子的结果 &q ...

  9. python编程从入门到实践答案-《Python编程:从入门到实践》第五章 if语句 习题答案...

    #5.1 major = 'Software Engineering' print("Is major =='Software Engineering'? I predict True.&q ...

  10. python快速编程入门课后题答案-《Python编程:从入门到实践》第五章 if语句 习题答案...

    #5.1 major = 'Software Engineering' print("Is major =='Software Engineering'? I predict True.&q ...

最新文章

  1. 可持久化普通线段树 ---- P2839 [国家集训队]middle 可持久化普通线段树 + 二分 求中位数最大值
  2. Linux环境下使用Mysql连接外部机器
  3. mysql 删除重复记录,只保留id字段值最大的记录
  4. 【图像分类】 关于图像分类中类别不平衡那些事
  5. java 界面线性布局_怎么用java代码写一个线性布局;布局里面有两个按钮是水平的...
  6. 云耀服务器切换系统,云耀云服务器重装操作系统
  7. BZOJ 1097 [POI2007]旅游景点atr
  8. sklearn GridSearchCV网格搜索案例与代码
  9. bookstore项目学到的对象
  10. Android 四大组件学习之Activity一
  11. RTMP 两种方式推流:推H.264、ACC和推FLV封装格式
  12. linux 下多个图片合并,FFmpeg将多张图片合成视频
  13. echarts模仿excel复合饼图(饼-饼)
  14. RESTful 接口设计规范
  15. ONOS架构中的YANG、P4 Runtime
  16. 2017ICPC北方邀请赛H题 MJF wants to work(贪心)
  17. ubuntu命令行配置文件夹共享
  18. 时间管理黄金法则分享,让职场的你受益一生
  19. MPLS基础概述MP-BGP实验(华为 DataCome)
  20. 今天,小灰36岁了!

热门文章

  1. 一只青蛙跳向三个台阶_9. 变态跳台阶
  2. Ubuntu上安装OpenGL
  3. 机器视觉基本设计因素有哪几点?
  4. chrome vue 未响应_vue之骨架屏踩坑之路
  5. Python入门教程100天:Day09-面向对象进阶
  6. 跨域问题的一次深入研究
  7. 写得蛮好的linux学习笔记五-认识SHELL(收藏)
  8. android windows的一些item属性
  9. MySQL字段类型详解
  10. 由a标签的onclick影出来的问题