
JVM
will way
这个作者很懒,什么都没留下…
展开
-
探究对象的结构
探究对象的结构(Header,InstanceData,Padding)Header(对象头)1.自身运行时数据(Mark Word)包括以下几类值:哈希值,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向线程时间戳2.类型指针InstanceDataPadding...原创 2019-05-08 10:29:08 · 146 阅读 · 0 评论 -
逃逸分析与栈上分配
我们都知道,Java 创建的对象都是被分配到堆内存上,但是事实并不是这么绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中创建出来的对象并一定分别在所认为的堆上。这两个点分别是Java中的逃逸分析和TLAB(Thread Local Allocation Buffer)线程私有的缓存区。逃逸分析,是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨...原创 2019-05-09 17:48:38 · 330 阅读 · 0 评论 -
JVM内存划分
# 运行时数据区## 1.线程共享区#### 1.1 方法区#### 1.2 Java堆 ## 2.线程独占区#### 2.1 虚拟机栈#### 2.2 本地方法栈#### 2.3 程序计数器原创 2019-05-07 14:01:07 · 85 阅读 · 0 评论 -
Java虚拟机内存管理----------程序计数器(线程独占区)
程序计数器1.程序计数器是一块较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器。2.程序计数器处于线程独占区。3.如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码的地址。如果正在执行的是 native方法,这个计数器的值为undifined。4.此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemeryError情况的区域。public v...原创 2019-05-07 14:33:11 · 309 阅读 · 0 评论 -
Java虚拟机内存管理----------Java虚拟机栈(线程独占区)
Java虚拟机栈1.虚拟机栈描述的是Java方法执行的动态内存模型2.栈帧每个方法执行都会创建栈帧,伴随着方法从创建到执行完成,用于存储局部变量表,操作数栈,动态链接,方法出口等。3.局部变量表3.1 存放编译期可知的各种基本数据类型,引用类型,returnAddress类型3.2 局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,在方法运...原创 2019-05-07 15:03:46 · 261 阅读 · 0 评论 -
Java虚拟机内存管理----------本地方法栈(线程独占区)
本地方法栈虚拟机栈为虚拟机执行Java方法服务本地方法栈为虚拟机执行native方法服务其他的与虚拟机栈是相同的原创 2019-05-07 15:18:39 · 488 阅读 · 0 评论 -
Java虚拟机内存管理----------Java堆(线程共享区)
Java堆1.存放对象实例2.垃圾收集器管理的主要区域3.新生代,老年代4.OutOfMemoryError异常使用-Xmx-Xms 来分配大小原创 2019-05-07 15:24:14 · 216 阅读 · 0 评论 -
Java虚拟机内存管理----------方法区(线程共享区)
方法区方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、 常量、 静态变量、 即时编译器编译后的代码等数据。 虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。类信息: 类的版本,类的字段,类的 方法,类接口方法区与永久代想垃圾回收在方法区的行...原创 2019-05-07 15:36:39 · 1102 阅读 · 0 评论 -
方法区----------运行时常量池(线程共享区)
运行时常量池运行时常量池(Runtime Constant Pool)是方法区的一部分。 Class文件中除了有类的版本、 字段、 方法、 接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。Java虚拟机对Class文件每一部分(自然也包括常量池)的格式都有严...原创 2019-05-07 16:59:22 · 1062 阅读 · 4 评论 -
对象的创建
对象的创建创建过程如下所示:给对象分配内存两种方式如下:1.指针碰撞 方式:假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump the Pointer)2.空闲列表 方式:如果Java堆中的内存并...原创 2019-05-07 18:16:16 · 151 阅读 · 0 评论 -
JDK命令行工具
JDK的命令行工具1.jps(JVM Process Status Tool):虚拟机进程状况工具执行命令如下: jps -l其他命令:LVMID:进程的本地虚拟机唯一ID (Local Virtual Machine Identifier,LVMID)jps -q 和 jps -m:jps -vjps -l2.jstat(JVM Statistics M...原创 2019-05-10 14:46:10 · 438 阅读 · 0 评论 -
JVM调优参数详解
GC有两种类型:Scavenge GC 和Full GC1、Scavenge GC一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,堆的Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor的两个区中。2、Full GC对整个堆进行整理,包括Young、Tenured和Perm。Full GC 比Scavenge GC要慢,因...转载 2019-07-15 17:54:12 · 536 阅读 · 0 评论 -
虚拟机类加载机制
1.概述虚拟机把描述类的数据从class类加载到内存中,并对数据进行校验、转化解析和初始化,最终形成可被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。与那些在编译时需要进行连接工作的语言不同,在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会类加载时增加一些性能开销,但是会为Java应用程序提供 高度的灵活性,Java里天生可以动态扩展的语...原创 2019-05-14 15:15:19 · 124 阅读 · 0 评论 -
对象的访问定位
对象的访问定位(使用句柄,直接指针)1.使用句柄如果使用句柄访问的话,那么Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息2.直接指针如果使用直接指针访问,那么Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference中存储的直接就是对象地址**这两种...原创 2019-05-08 10:44:56 · 256 阅读 · 0 评论 -
垃圾回收——》垃圾对象判断,回收算法,垃圾收集器
1.如何判断对象为垃圾对象1.引用计数法 定义:在对象中添加一个引用计数器,当有地方引用这个对象的时候,此对象的引用计数器值就+1,当引用失效的时候,此对象的引用计数器值就-1。 打印垃圾回收信息添加在idea中添加以下参数即可打印: -XX:+PrintGC (与 -verbose:gc 是相同作用) -XX:+PrintGCDetails (日志输出具体详情) -XX:+...原创 2019-05-08 14:13:25 · 545 阅读 · 0 评论 -
JVM虚拟机种类
1.Sun Classic VM2.Exact VM3.HotSpot VM4.KVM(Kilobyte)5.JRockit6.J97.Azul VM8.Liquid VM9.Dalvik VM10.Microsoft JVM原创 2019-05-06 16:25:13 · 7280 阅读 · 0 评论 -
内存分配策略
这里的内存指的是Java堆内存 1.优先分配到Eden区 2.如果有大对象,直接进入老年代 3.长期存活的对象,分配到老年代 4.如果Eden空间不够,需要向老年代借空间,空间担保 5.动态对象年龄判断1.优先分配到Eden区public class TestMemory { @Test public void test01() { by...原创 2019-05-09 10:38:23 · 912 阅读 · 0 评论 -
JVM调优之探索CMS和G1的物理内存归还机制
转自(https://www.cnblogs.com/seifon/p/11228224.html)前言:公司有一个资产统计系统,使用频率很低,但是要求在使用时查询速度快,因此想到做一些缓存放在内存中,在长时间没有使用,持久化到磁盘中,并对垃圾进行回收,归还物理内存给操作系统,从而节省宝贵资源给其它业务系统。当我做好缓存时,却发现了一个棘手的问题,通过程序释放资源并通知GC回收资源后,堆内存的...转载 2019-07-22 21:15:19 · 1079 阅读 · 0 评论