zoukankan      html  css  js  c++  java
  • 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运行的项目可以自定义的,堆的大小,都可以
     

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

     

     

  • 相关阅读:
    SQL SERVER 2008的元数据视图
    SQL Server 2008 中的 XML 功能
    SQL SERVER 2008的层次结构支持
    C#打包程序
    SQL SERVER 2008的top增强
    SQL SERVER导出数据字典
    SQL SERVER 2008的转置函数PIVOT
    SQL SERVER 2008的SQLCMD模式
    SQL SERVER 2008传递表值参数
    SQL Server 2005导出表中数据的SQL脚本形式(即INSERT语句)
  • 原文地址:https://www.cnblogs.com/bee-home/p/7856408.html
Copyright © 2011-2022 走看看