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版)> ...
随机推荐
- day32 信号量 事件 管道 进程池
今日主要内容: 1.管道(Pipe) 数据接收一次就没有了 2.事件(Event) 3.基于事件的进程通信 4.信号量(Semaphore) 5. 进程池(重点) 6.进程池的同步方法和异步方法 7. ...
- C++模板类之pair
Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型,第一个元素是int型的 ...
- Linux命令----uname查看系统信息
uname就是UNIXname的缩写 1.uname可以查询操作系统信息 [root@yuan ~]# uname Linux 2.uname -n显示系统的主机名 [root@yuan ~]# un ...
- 文件上传FormData
<div class="modal-dialog"> <div class="modal-content"> <div class ...
- mybatis 配置文件 配置别名
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC &q ...
- Convert the AScii to SAC file
readtable *.txt w sac filename.sac ch delta dela0 w over
- Day10作业及默写
1,继续整理函数相关知识点,写博客. 2,写函数,接收n个数字,求这些参数数字的和.(动态传参) def func(*number): sum=0 for num in number: sum+=nu ...
- IntelliJ IDEA总是提示Cannot resolve symbol
之前还用得好好的,不知道是点了工具栏位置的包路径还是哪里,然后几乎工程每个Java文件都在报Cannot resolve symbo错误,即使像String这样的语句也报错,我可以保证所有该引用的包都 ...
- Python 生成器函数
def func(): print("我叫周润发") return "林志玲" # return在函数中表示返回的意思 ret = func() print(& ...
- react native 之 获取键盘高度
多说不如多撸: /** * Created by shaotingzhou on 2017/2/23. *//** * Sample React Native App * https://github ...