java虚拟机(三)--HotSpot 对象】的更多相关文章

普通对象的创建(不包括数组和class对象): 当虚拟机遇到new指令时,会在常量池中检查是否包含这个类的符号引用(全限定名),通过这个确定是否经过类加载的过程,如果true,为该 对象分配内存,对象大小在类加载过程就已经确定.如果false,需要进行类加载. 分配内存 1.分配内存的方式: 指针碰撞:如果内存是绝对规整的,使用过的在一边,未使用过的在另一边,中间有个指针作为分界点的指示器,为对象分配内存的时候,只需 要向未使用过的一边移动与对象大小相同的距离完成内存分配 空闲列表:内存非规整的…
对象的创建 虚拟机遇到一条字节码new指令时,开始对象创建过程. 首先去检查这个指令的参数是否能在常量池定位到一个类的符号引用: 检查这个符号引用代表的类是否已被加载.解析和初始化,如果没有就必须执行相应的类加载过程: 根据方法区中该类的信息确定对象的所需空间大小: 虚拟机为新生对象分配内存: 将对象实例的内存(不包括对象头)进行初始化为零值: 配置对象头的信息: 调用对象的构造函数进行初始化. 这样,一个真正可用的对象被完全构造出来了. 多线程中,引用指向对象的内存空间和对象初始化操作可能会出…
根据Java虚拟机规范,虚拟机内存中除过程序计数器之外的运行时数据区域都会发生OutOfMemoryError(OOM),本文将通过实际例子验证分析各个数据区域OOM的情况.为了更贴近生产,本次所有例子都是通过调用接口触发,并使用jvisualvm工具监控tomcat内存进行分析. 一.Java堆溢出 Java堆主要用于存储对象和数组实例,只要不断创建对象或者数组,并且保证CG Roots(垃圾收集器对象)到对象之间有可达路径来避免垃圾回收机制清除这些对象,在对象数量到达最大堆的限制后就会产生内…
类加载机制jvm把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被jvm直接使用的java类型.在java中,类型的加载.连接和初始化都是在程序运行期间完成的. 类的生命周期加载.验证.准备.解析.初始化.使用.卸载. 如果类没有初始化过,以下5种情况需要立即对类进行初始化:1.遇到new(使用new创建对象).getstatic(获取类的静态变量).putstatic(设置类的静态变量).invokestatic(调用类的静态方法)这4条字节码指令时.…
所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收. Java虚拟机的内存分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆和方法区. 其中程序计数器.虚拟机栈和本地方法栈是线程私有的,所以对于何时回收这三部分内存只需要根据线程的生存周期就可以了. 而堆和方法区是线程共享的,其诞生和销毁伴随的虚拟机的启动和停止,所以需要特定的算法来判断内存是否可以被回收. 堆内存的回收 判断那些对象需要回收 垃圾回收器在回收之前,需要判断那些对象已经不会被…
垃圾收集器 新生代收集器 1.Serial收集器 特点: 单线程工作,收集的时候就会停止其他所有工作线程,用户不可知不可控,会使得用户界面出现停顿. 简单高效,是所有收集器中额外内存消耗最少的. 没有线程交互的开销,单线程收集效率高. 对于客户端模式下的虚拟机是一个很好的选择. 采用标记复制算法. 2.ParNew收集器 是Serial收集器的多线程版本.采用多条GC线程并行地清理垃圾.任然需要在清理过程中停止一切用户线程. 特点: 多线程执行,适合多处理器环境,单处理器效率不如Serial.…
Java堆是和Java应用程序关系最为紧密的内存空间,几乎所有的对象都存放在堆中.并且堆是完全自动化管理的. 根据垃圾回收机制的不同,Java堆有可能有不同的结构.最为常见的一种就是将整个Java堆分为新生代和老年代.其中,新生代存放新生对象或者年龄不大的对象. 老年代存放老年对象.新生代可能分为eden区.s0区.s1区,s0和s1也被成为from和to区域,他们是两块大小相等,可以互换角色的内存空间. 在多数情况下,对象首先分配在eden区,在一次新生代回收后,如果对象还存活,则会进入s0或…
JDK自带的工具可以方便的帮助我们处理一些问题,包括查看JVM参数,分析内存变化,查看内存区域,查看线程等信息. 我们熟悉的有java.exe,javac.exe,javap.exe(偶尔用),jps.exe,jmap.exe....等,下面会详细介绍.分别在linux和windows下面介绍.windows与linux下面使用的都是JDK1.7.0_80 windows下的jdk版本如下: $ java -version java version "1.7.0_80" Java(TM…
1.第一门真正使用内存动态分配和垃圾收集技术的语言:Lisp 2.程序计数器.虚拟机栈.本地方法栈这3个区域随线程而生灭,这几个区域的内存会随着方法结束或线程结束而回收,GC关注的是Java堆和方法区 3.引用计数法很难解决对象之间相互循环引用的问题 4.在主流商用程序语言的主流实现中,都是通过可达性分析而不是引用计数来判定对象是否存活的. 可达性分析原理:通过一系列称为GC Roots的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链…
1:序列化技术: 序列化的过程就是将对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,可以通过管道或线程读取,或通过网络连接将对象数据发送到另一主机.对象序列化功能非常简单.强大,在RMI.Socket.JMS.EJB都有应用.对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义. 一:对象序列化可以实现分布式对象. 主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时…