day 05JVM和深入理解java虚拟机

-----------------Java 虚拟机发展史

PS: Sun公司有 HotSpot, BEA公司有JRockit,IBM有 J9  这三个是高性能VM

在Oracle收购Sun和BEA这两家公司以后,进行两个优点整合

-------------------上面的主要是电脑端的发展,其实还有很多没有商用的虚拟机如手机端

PS:day 05JVM和深入理解java虚拟机这是运行在专门硬件平台的虚拟机

PS:day 05JVM和深入理解java虚拟机这两个只能是虚拟机,不能代表java虚拟机

-------------------------------------------------------------------------------------------------

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

PS:上图为java虚拟机运行时的数据区,红色方块是线程共享区域
方法区 : 放一个类的相关信息,类的定义、常量,静态变量 。 是各个线程共享的内存区域
堆 : java的一篇共享区域
栈:线程私有,放在临时变量
程序计数器:标记每个线程运行到哪里了
本地栈:调用本地的操作系统方法

day 05JVM和深入理解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: 现在收集器基本都是  分带收集算法

day 05JVM和深入理解java虚拟机

PS:上图是对堆的细分,堆又分为新生代、老生带、永久代;他是根据对象存活的年龄去划分的
刚初始化的数据在新生代中,处于伊甸园阶段。经过垃圾回收以后,会幸存一部分,放在FromSpace,to sapce是为了垃圾回收标记清理算法方便,空出一部分内存用作整理排序。
当FromSpace的对象(经过15次回收对象以后)好的话,就进入老生带,然后再是永久代。

.1.2.     栈(Stack

相对于Java Heap来讲,Java Stack是线程私有的,她的生命周期与线程相同。Java Stack描述的是Java方法执行时的内存模型,每个方法执行时都会创建一个栈帧(Stack Frame)用语存储局部变量表、操作数栈、动态链接、方法出口等信息。从下图从可以看到,每个线程在执行一个方法时,都意味着有一个栈帧在当前线程对应的栈帧中入栈和出栈。

day 05JVM和深入理解java虚拟机

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中,已经把原本放在永久代的字符串常量池移出。

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

day 05JVM和深入理解java虚拟机

.1.5.    总结

1、  线程私有的数据区域有:

程序计数器

Java虚拟机栈(Java Stack)

本地方法栈(Native Stack)

2、  线程共有的数据区域有:

堆(Java Heap)

方法区

------------------------------------------

day 05JVM和深入理解java虚拟机

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

1.会先检查类是否被加载过

day 05JVM和深入理解java虚拟机

2.为对象分配内存

day 05JVM和深入理解java虚拟机

PS: 堆空间规整的话,  中间会对内存进行区分,  有用过的内存是一部分,空闲的是另一部分;这种模式叫做指针碰撞

堆空间不规则的话,会记录那里用了,哪里没有用, 这种分配方式叫做“空闲列表”

至于采取哪种方式由堆内存是否 还规整

day 05JVM和深入理解java虚拟机

PS: 解决方案是 1.要不只有一个人读 2.要不两人都有,这是书上TLAB保证同步性

3.初始化数据为0

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

1.对象头

a. 运行时数据

day 05JVM和深入理解java虚拟机

b.   类型指针

day 05JVM和深入理解java虚拟机

2.实例数据在存储顺序 受 源代码定义排序和 数据类型大小影响

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

PS: 引用计数算法和可达性分析算法  是判定对象是不是还是活着

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

PS: 意思是   对象要死  经过2次标记,   第一次要需要看看是否要finalize,第二次在finalize是否能逃脱,能逃脱不会死

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

有大的对象的时候无法保存。

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

PS: 垃圾收集器是不同的厂商对不同垃圾收集算法的实现

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

------------------------------------------------------------------------------------

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

.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来查询了,双击其中一个进程即可开始监控。也可以“远程连接服务器,进行远程虚拟机的监控。”

day 05JVM和深入理解java虚拟机

PS:可以通过这些工具对内存分析,线程分析。
PS:同时可以使用内存分析工工具 对内存中可能出现的错误进行分析 PS:JAVA运行的项目可以自定义的,堆的大小,都可以
day 05JVM和深入理解java虚拟机
 

-----------------------------------------------------------------------------------------

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

day 05JVM和深入理解java虚拟机

上一篇:js文字跳动效果


下一篇:Flash 开发环境搭建和文字滚动效果实例