day 05JVM和深入理解java虚拟机
-----------------Java 虚拟机发展史
PS: Sun公司有 HotSpot, BEA公司有JRockit,IBM有 J9 这三个是高性能VM
在Oracle收购Sun和BEA这两家公司以后,进行两个优点整合
-------------------上面的主要是电脑端的发展,其实还有很多没有商用的虚拟机如手机端
PS:这是运行在专门硬件平台的虚拟机
PS:这两个只能是虚拟机,不能代表java虚拟机
-------------------------------------------------------------------------------------------------
PS:上图为java虚拟机运行时的数据区,红色方块是线程共享区域
方法区 : 放一个类的相关信息,类的定义、常量,静态变量 。 是各个线程共享的内存区域
堆 : java的一篇共享区域
栈:线程私有,放在临时变量
程序计数器:标记每个线程运行到哪里了
本地栈:调用本地的操作系统方法
PS: 程序计数器是线程私有的,记录每个线程的执行位置,便于多线程运行
.1.1. 堆(Heap)
对于大多数应用来说,Java Heap是Java虚拟机管理的内存的最大一块,这块区域随着虚拟机的启动而创建。在实际的运用中,我们创建的对象和数组就是存放在堆里面。如果你听说线程安全的问题,就会很明确的知道Java Heap是一块共享的区域,操作共享区域的成员就有了锁和同步。
与Java Heap相关的还有Java的垃圾回收机制(GC),Java Heap是垃圾回收器管理的主要区域。程序猿所熟悉的新生代、老生代、永久代的概念就是在堆里面,现在大多数的GC基本都采用了分代收集算法。如果再细致一点,Java Heap还有Eden空间,From Survivor空间,To Survivor空间等。
Java Heap可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
PS: 现在收集器基本都是 分带收集算法
PS:上图是对堆的细分,堆又分为新生代、老生带、永久代;他是根据对象存活的年龄去划分的
刚初始化的数据在新生代中,处于伊甸园阶段。经过垃圾回收以后,会幸存一部分,放在FromSpace,to sapce是为了垃圾回收标记清理算法方便,空出一部分内存用作整理排序。
当FromSpace的对象(经过15次回收对象以后)好的话,就进入老生带,然后再是永久代。
.1.2. 栈(Stack)
相对于Java Heap来讲,Java Stack是线程私有的,她的生命周期与线程相同。Java Stack描述的是Java方法执行时的内存模型,每个方法执行时都会创建一个栈帧(Stack Frame)用语存储局部变量表、操作数栈、动态链接、方法出口等信息。从下图从可以看到,每个线程在执行一个方法时,都意味着有一个栈帧在当前线程对应的栈帧中入栈和出栈。
PS:也就是一个线程,对应着一个栈,线程间共享堆空间
PS:判断一个对象,该不该被垃圾回收?使用根节点搜索算法, 判断如果与跟节点没关系,就应该把它回收掉了。
图中可以看到每一个栈帧中都有局部变量表。局部变量表存放了编译期间的各种基本数据类型,对象引用等信息。
.1.3. 本地方法栈(Native Stack)
本地方法栈(Native Stack)与Java虚拟机站(Java Stack)所发挥的作用非常相似,他们之间的区别在于虚拟机栈为虚拟机栈执行java方法(也就是字节码)服务,而本地方法栈则为使用到Native方法服务。
.1.4. 方法区(Method Area)
方法区(Method Area)与堆(Java Heap)一样,是各个线程共享的内存区域,它用于存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是她却有一个别名叫做非堆(Non-Heap)。分析下Java虚拟机规范,之所以把方法区描述为堆的一个逻辑部分,应该觉得她们都是存储数据的角度出发的。一个存储对象数据(堆),一个存储静态信息(方法区)。
在上文中,我们看到堆中有新生代、老生代、永久代的描述。为什么我们将新生代、老生代、永久代三个概念一起说,那是因为HotSpot虚拟机的设计团队选择把GC分代收集扩展至方法区,或者说使用永久代来实现方法区而已。这样HotSpot的垃圾收集器就能想管理Java堆一样管理这部分内存。简单点说就是HotSpot虚拟机中内存模型的分代,其中新生代和老生代在堆中,永久代使用方法区实现。根据官方发布的路线图信息,现在也有放弃永久代并逐步采用Native Memory来实现方法区的规划,在JDK1.7的HotSpot中,已经把原本放在永久代的字符串常量池移出。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.1.5. 总结
1、 线程私有的数据区域有:
程序计数器
Java虚拟机栈(Java Stack)
本地方法栈(Native Stack)
2、 线程共有的数据区域有:
堆(Java Heap)
方法区
------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.会先检查类是否被加载过
2.为对象分配内存
PS: 堆空间规整的话, 中间会对内存进行区分, 有用过的内存是一部分,空闲的是另一部分;这种模式叫做指针碰撞
堆空间不规则的话,会记录那里用了,哪里没有用, 这种分配方式叫做“空闲列表”
至于采取哪种方式由堆内存是否 还规整
PS: 解决方案是 1.要不只有一个人读 2.要不两人都有,这是书上TLAB保证同步性
3.初始化数据为0
1.对象头
a. 运行时数据
b. 类型指针
2.实例数据在存储顺序 受 源代码定义排序和 数据类型大小影响
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PS: 引用计数算法和可达性分析算法 是判定对象是不是还是活着
PS: 意思是 对象要死 经过2次标记, 第一次要需要看看是否要finalize,第二次在finalize是否能逃脱,能逃脱不会死
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
有大的对象的时候无法保存。
PS: 垃圾收集器是不同的厂商对不同垃圾收集算法的实现
------------------------------------------------------------------------------------
.1. java监控工具使用
.1.1. jconsole
jconsole是一种集成了上面所有命令功能的可视化工具,可以分析jvm的内存使用情况和线程等信息。
启动jconsole
通过JDK/bin目录下的“jconsole.exe”启动Jconsole后,将自动搜索出本机运行的所有虚拟机进程,不需要用户使用jps来查询了,双击其中一个进程即可开始监控。也可以“远程连接服务器,进行远程虚拟机的监控。”
.1. java监控工具使用
.1.1. jconsole
jconsole是一种集成了上面所有命令功能的可视化工具,可以分析jvm的内存使用情况和线程等信息。
启动jconsole
通过JDK/bin目录下的“jconsole.exe”启动Jconsole后,将自动搜索出本机运行的所有虚拟机进程,不需要用户使用jps来查询了,双击其中一个进程即可开始监控。也可以“远程连接服务器,进行远程虚拟机的监控。”
.1. java监控工具使用
.1.1. jconsole
jconsole是一种集成了上面所有命令功能的可视化工具,可以分析jvm的内存使用情况和线程等信息。
启动jconsole
通过JDK/bin目录下的“jconsole.exe”启动Jconsole后,将自动搜索出本机运行的所有虚拟机进程,不需要用户使用jps来查询了,双击其中一个进程即可开始监控。也可以“远程连接服务器,进行远程虚拟机的监控。”
PS:可以通过这些工具对内存分析,线程分析。
PS:同时可以使用内存分析工工具 对内存中可能出现的错误进行分析 PS:JAVA运行的项目可以自定义的,堆的大小,都可以
-----------------------------------------------------------------------------------------
day 05JVM和深入理解java虚拟机的更多相关文章
- 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...
- 《深入理解 java虚拟机》学习笔记
java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.
- (1) 深入理解Java虚拟机到底是什么?
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 作为一个Java程序员,我们每天都在写Java ...
- 深入理解java虚拟机(7)---线程安全 & 锁优化
关于线程安全的话题,足可以使用一本书来讲解这些东西.<Java Concurrency in Practice> 就是讲解这些的,在这里 主要还是分析JVM中关于线程安全这块的内容. 1. ...
- 深入理解java虚拟机(6)---内存模型与线程 & Volatile
其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...
- 深入理解java虚拟机(5)---字节码执行引擎
字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...
- 深入理解java虚拟机(4)---类加载机制
类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态 ...
- 深入理解java虚拟机(1)------内存区域与内存溢出
在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻. 而Java确把这一工作交给了虚拟机来处理. 我们首先来看看关于内存的问题. 1.问题: 1)java ...
- 什么是HotSpot VM & 深入理解Java虚拟机
参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> ...
随机推荐
- vue-router-7-重定向及别名
const router = new VueRouter({ mode: 'history', base: __dirname, routes: [ { path: '/', component: H ...
- 服务器由于redis未授权访问漏洞被攻击
昨天阿里云拦截到了一次异常登陆,改了密码后就没有管他, 今天阿里云给我发消息说我的服务器可能被黑客利用,存在恶意发包行为....... 不过我不打算只是单纯的重置系统,经过一系列的查找原因后,发现被攻 ...
- Mysql数据库操作语句总结
简单复习下: 增insert into -- 删 delete from -- 改 update table名字 set -- 查 select * from -- 一.SQL定义 SQL(Str ...
- aapt获取包名和activity,启动app
1.android sdk的环境安装好了之后,在build-tools\** 的目录下找到aapt.exe,将这个路径设置环境变量,添加到path下 2.在cmdl里面输入:aapt,出现以下内容就是 ...
- 20165326 学习基础和c语言基础调查
学习基础和c语言基础调查 一.关于个人技能 阅读了娄老师关于做中学的文章,我想起了自己之前学习技能的经历. 从小到大我学过的东西不少,除学校的教育课程外,我还参加过各种兴趣班,书法.绘画.舞蹈.吉他. ...
- leetcode第15题:三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- python 常用的高阶函数
前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...
- 临时调用call()与apply()方法
当在某个局域范围内要调用构造函数中或者其他局域范围内的方法 此时可以用到临时调用方法call与apply 虽然这两个方法都是起临时调用的功能,但是用法不一样 call(obj,val) obj:对象名 ...
- 线程安全的"懒汉"单例模式
所谓线程不安全实际上就是一段代码在同一时间被两个线程同时执行,导致运行结果与单个线程运行结果不相同 新建一个单例模式类和一个多线程测试类 public class TestSingleTon impl ...
- RESTful Service API 常见问题解决方案
REST 风格的优秀设计应该像下面这些: - GET /users 获取所有用户 - GET /users/1234 获取ID为1234的用户 - POST /users 创建一个新用户 - PUT ...