Java虚拟机
itcats_cn
学习技术,分享技术
展开
-
jvm虚拟机内存分配策略
内存分配策略 分配原则 优先分配到Eden 大对象可能直接被分配到老年代 为什么大对象直接被分配到老年代?答:大对象一般是大的字符串或数组,大对象一般都不是朝生夕死的,它的存活时间比较长。因为新生代中垃圾回收算法一般采用复制算法,Eden区域执行gc频繁,若大对象存在于新生代中,每次执行gc都需要移动大对象,性能低,所以大对象放在老年代中,...原创 2018-07-17 16:54:13 · 693 阅读 · 0 评论 -
jvm垃圾回收
打印gc信息VM arguments: -verbose:gc -XX:+PrintGCDetails1、如何判定对象为垃圾对象 引用计数法 答:引用计数法是一个较为简单的算法,实际上就是在对象中添加一个引用计数器,这个计数器记录着该对象被使用的次数,当有地方引用到这个对象的时候,引用计数器的值就+1,当引用失效的时候(如把对象置为null),计数器就-1。垃圾...原创 2018-07-07 23:31:30 · 447 阅读 · 1 评论 -
【面试重点】Java类加载机制和类加载器
Java类加载机制概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型。 HotspotVM默认使用懒加载机制,在加载开始后,连接紧接着执行(并不是加载完成后,连接才执行,两者可以理解为并行执行),加载完毕后,连接才会完毕。 初始化【面试重点】1、遇到new,getstatic、putsta...原创 2018-07-20 11:59:53 · 1401 阅读 · 2 评论 -
Java双亲委派模型
从jdk1.2开始,java虚拟机规范推荐开发者使用双亲委派模式(ParentDelegation Model)进行类加载,其加载过程如下:如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器去完成 每一层的类加载器都把类加载请求委派给父类加载器,直到所有的类加载请求都应该传递给顶层的启动类加载器 如果顶层的启动类加载器加载器无法完成加载请求时,...原创 2018-07-21 00:37:09 · 369 阅读 · 0 评论 -
Java运行时栈帧结构
栈帧也叫过程活动记录,是编译器用来进行方法调用和方法执行的一种数据结构,它是虚拟机运行时数据区域中的虚拟机栈的栈元素,栈帧中包括了局部变量表,操作数栈,动态连接和方法返回地址以及额外的一些附加信息,在编译过程中,局部变量表的大小已经确定,操作数栈深度也已经确定,因此栈帧在运行的过程中需要分配多大的内存是固定的,不受运行时影响,对于没有发生逃逸的对象也会在栈上分配内存,对象的大小其实在运行时也是确定...原创 2018-07-21 13:52:15 · 675 阅读 · 0 评论 -
【Java面试重点】Java方法调用——解析与分派
关于方法调用的几个字节码指令:invokestatic invokespecial invokevirtual invokeInterface invokedynamic若您不太了解以上几个了解指令,这边引用别人写的一篇好文对比 5条方法调用字节码指令区别JVM指令之invokestatic,invokespecial,invokeinterface,...原创 2018-07-21 13:56:02 · 1453 阅读 · 0 评论 -
Java内存模型之重排序
在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 1. 在单线程环境下不能改变程序运行的结果; 2. 存在数据依赖关系的不允许重排序如果看过LZ上篇博客的就会知道,其实这两点可以归结于一点:无法通过happens-before...转载 2018-08-02 19:27:45 · 226 阅读 · 0 评论 -
Java并发编程之happens-before
happens-before是JMM最核心的概念,理解happens-before是理解JMM的关键。 一.JMM的设计 首先,让我们先分析一下JMM的设计意图。从JMM的设计者的角度,在设计JMM的时候要考虑一下两个关键因素: 1.程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于一个强内存模型来编写代码。 2.编译器和处理器对内存模型...转载 2018-08-02 20:36:09 · 192 阅读 · 0 评论 -
java中对象是如何访问定位的?
只是简单的Java虚拟机栈中局部变量表的引用指向堆中实例对象的内存地址? 这只是其中的一种方式罢了。实际上,java中对象的访问定位有两种方式。 我们常熟知的是方式2:栈中的引用直接指向堆中的实例对象的内存地址那么,为什么还会存在方式1 使用句柄呢?这种方式有什么好处呢?答:好处就是,不管堆中的实例对象地址是否改变,是否被垃圾回收,栈中的引用是不会发生改变的,改变的是堆中句...原创 2018-07-07 16:17:34 · 1637 阅读 · 0 评论 -
java对象的结构
java对象的结构是由Header对象头、InstanceData、Padding组成 目录Header(对象头)InstanceDataPadding Header(对象头) 1、自身运行时的数据(Mark Word) ...原创 2018-07-07 10:32:14 · 2237 阅读 · 0 评论 -
Java虚拟机jvm之对象的创建过程
1、通过在常量池中寻找类的符号引用检测类是否被加载当虚拟机执行到new时,会先去常量池中查找这个类的符号引用。如果能找到符号引用,说明此类已经被加载到方法区(方法区存储虚拟机已经加载的类的信息),可以继续执行;如果找不到符号引用,就会使用类加载器执行类的加载过程,类加载完成后继续执行。————关于类加载流程请查看《【面试重点】Java类加载机制和类加载器》2、为对象分配内存类加载完...原创 2018-07-06 22:48:08 · 309 阅读 · 0 评论 -
java虚拟机工具
1、 jps(Java process status) 类似于windows下的任务管理器,把j去掉 ps就是Linux下进程管理 本地虚拟机唯一id : lvmid local virtual machine id//接收程序运行时传入主类参数jps -m//显示运行时主类全名信息jps -l//接收虚拟机参数jps -v ...原创 2018-07-17 18:28:13 · 351 阅读 · 0 评论 -
java学习-【转】JVM JSTAT命令的用法和参数讲解
原文地址:http://flychao88.iteye.com/blog/2192259 https://blog.csdn.net/bohu83/article/details/51124058原文如下一、常用命令分析1. jstat -gc pid 可以显示gc的信息,查看gc的次数,及时间。 其中最后五项,分别是young gc...原创 2018-07-17 18:30:08 · 365 阅读 · 0 评论 -
jdk jre jvm之间的区别你真的了解吗
这是oracle官网所给的jdk7版本下,jdk jre jvm之间的关系https://docs.oracle.com/javase/7/docs/ 看完上图之后查看整体结构最外层为jdk(java开发工具集 Java Development Kit)jdk内部包含了jre(java运行时环境 Java Runtime Environment)而j...原创 2018-07-05 21:30:48 · 359 阅读 · 0 评论 -
Java虚拟机之class文件结构
Class文件是一组按以8位字节为基础单元的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件中,中间没有添加任何的分隔符,整个Class文件中储存的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到8位字节以上的空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。Class文件中有两种数据类型,分别是无符号数和表。 ...原创 2018-07-18 19:48:20 · 286 阅读 · 0 评论 -
jvm虚拟机内存区域划分(运行时数据区)
大三下学期,距离放假还有一个星期,打算重温一下《深入理解jvm虚拟机》这本书JVM运行时数据区我们知道,每个线程都是一个顺序执行的单元所谓的线程独占区,就是每开辟一个线程,线程内都会包含一个相互独立的(虚拟机栈、本地方法栈、程序计数器),而所谓的线程共享区,就是多个线程同时共享同一个(方法区、Java堆)。下面就一起来看看上图所述的JVM运行时的数据区结构 先来说说...原创 2018-07-06 15:20:32 · 662 阅读 · 0 评论 -
Java常用的字节码指令
Java虚拟机的指令是由一个字节长度的,代表着某种特定操作含义的数字,称之为操作码,以及跟随其后的0至多个代表次操作所需的操作数而构成。操作码的长度为1个字节,因此最大只有256条基于栈的指令集架构(jvm使用) / 而安卓使用的Dalvik虚拟机是基于寄存器的指令集架构 字节码和数据类型在虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息,如( ...原创 2018-07-19 13:38:16 · 2086 阅读 · 0 评论 -
jvm参数调优
虚拟机参数配置在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障排查会有一定的帮助,为此,在虚拟机提供了一些跟踪系统状态的参数,使用给定的参数执行Java虚拟机,就可以在系统运行时打印相关日志,用于分析实际问题。我们进行虚拟机参数配置,其实就是围绕着堆、栈、方法区、进行配置。 堆的参数配置-XX:+PrintGC 每次触发GC的时候打印...原创 2018-09-01 16:26:13 · 292 阅读 · 0 评论