JVM
菜瓜_牛顿
枪如惊雷,照一身肝胆
展开
-
Java的NIO
核心内容Java NIO的实现主要涉及三大核心内容:Selector(选择器)、Channel(通道)和Buffer(缓冲区)。Selector用于监听多个Channel的事件,比如连接打开或数据到达,因此,一个线程可以实现对多个数据Channel的管理。传统I/O基于数据流进行I/O读写操作;而Java NIO基于Channel和Buffer进行I/O读写操作,并且数据总是被从Channel读取到Buffer中,或者从Buffer写入Channel中。ChannelChannel和I/O中原创 2020-05-26 09:59:01 · 118 阅读 · 0 评论 -
*CMS和G1
CMSCMS(concurrent mark sweep) 是一种以获取最短回收停顿时间为目标的垃圾收集器。这是因为CMS在工作时可以与用户线程并发执行,以此来降低停顿时间。CMS用于老年代回收,使用标记-清除算法。为什么不采用标记-整理算法?cms 主要核心是降低停顿时间,清除垃圾时,应用程序还在运行,如果采用整理的方式,设计到存活对象的移动,此时不停顿很难处理,这样会加大停顿时间。 cms主要用于老年代,而老年代的对象可能会长时间存活且存活率高,再或者就是一些大对象,那么对这些对象的移原创 2020-05-22 19:13:04 · 354 阅读 · 0 评论 -
*Minor gc 和 full Gc
minor gc对新生代进行gc,比较频繁,因为大部分对象的生命周期都比较短,在新生代回收性能消费小; 当Eden区空间不足的时候,就会触发minor gcfull gc全堆范围的gc,默认堆空间使用达到80%的时候会触发full gc , 老年代空间不足,永久代空间不足,调system.gc(),minor 是的悲观策略,或者 jmap -dump:live 时都会触发full gcMinor gc 过程把在Eden去和SurvivorFrom区中存活的对象复制到Surviv...原创 2020-05-22 14:12:50 · 251 阅读 · 0 评论 -
*JVM调优参数
JVM相关参数:参数名称 含义 默认值 -Xms 初始堆大小 物理内存的1/64(<1GB) 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. -Xmx 最大堆大小 物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 -Xmn 年轻代大小(1.4or lator) 注意:此处的大小是(ed..原创 2020-05-22 11:56:57 · 154 阅读 · 0 评论 -
方法调用指令invoke...
1、方法调用(分派、执行过程): JVM调用方法有五条指令,分别是(1)invokestatic,用来调用static方法(类方法)(2)invokespecial,用来调用需要特殊处理的实例方法,私有方法,父类方法(super.),初始化方法。在对象的创建过程中,new之后很多都会执行方法,就是依赖字节码中是否包含invokespecial指令。(3)invok原创 2017-08-08 17:53:10 · 4009 阅读 · 1 评论 -
类的初始化
1、同一个jvm的所有线程、变量都处于同一个进程里,他们都使用jvm进程的内存区。jvm进程停止的情况:程序正常运行结束;遇到没有捕获的Exception 或者Error;程序遇到System.exit()或者Runtime.getRuntime.exit() (遇到这两个方法 finally也不会执行);平台强制关闭jvm例子: class A{ public static int原创 2017-03-31 16:26:04 · 311 阅读 · 0 评论 -
*类的加载机制
一、加载JVM主要完成三件事:1、通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件)。而获取的方式,通过jar包、war包、网络中获取、JSP文件生成等方式。2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。这里只是转化了数据结构,并未合并数据。(方法区就是用来存放已被加载的类信息,常量,静态变量,编译后的代码的运行时内存区域)3、在内原创 2017-05-15 20:36:42 · 365 阅读 · 0 评论 -
双亲委派模型和自定义类加载器
1、根装载器(启动类装载器)2、扩展类装载器3、系统类装载器4、用户自定义类加载器rt.jar是JAVA基础类库,dt.jar是关于运行环境的类库,tools.jar是工具类库设置在classpath里是为了让你import*web系统都用到tool.jar2.双亲委派模型: protected Class loadClass(String name, boolean原创 2017-08-09 15:14:49 · 362 阅读 · 0 评论 -
*JVM运行时数据区域
1.程序计数器(线程私有,没有OutOfMemoryError)当前线程所执行字节码的行号指示器。字节码解释器的工作就是通过改变这个计数器的值来获取下一条要执行的字节码。JAVA多线程通过线程轮换机制分配处理器的,一个处理器会执行一个线程中的一条指令,因此每个线程都需要一个独立的程序计数器,各线程之间计数器互不影响如果线程正在执行一个JAVA方法,那么计数器记录的是字节码指定的地址;如原创 2017-03-14 22:07:41 · 332 阅读 · 0 评论 -
invokespecial指令
new一个对象包括:类是否加载、为对象分配内存、并发处理、内存空间初始化、对象设置等步骤,当然new之后有时候会执行,这主要依据字节码中是否包含invokespecial指令。下面主要说一下该指令主要目的:得到对象存在堆中的地址,这样就可以用当前类,父类,父父类,即继承层的所有对象。 把继承层的所有对象的数据和方法为自己当前对象使用。原创 2017-08-07 15:39:57 · 7171 阅读 · 0 评论 -
堆内存相关问题
在jvm运行时区域中详细阐述了各内存的功能和分配,这里不再重复。当Java程序开始运行时,JVM会从操作系统获取一些内存。JVM使用这些内存,这些内存的一部分就是堆内存。堆内存通常在存储地址的底层,向上排列。当一个对象通过new关键字或通过其他方式创建后,对象从堆中获得内存。当对象不再使用了,被当做垃圾回收掉后,这些内存又重新回到堆内存中。在大多数32位机、Sun的JVM上,Java的原创 2017-03-17 11:48:42 · 363 阅读 · 0 评论 -
*内存泄漏和内存溢出
(1)内存泄漏和内存溢出内存泄漏:分配出去的内存无法回收(不再使用的对象或者变量仍占内存空间),在Java中内存泄漏就是存在一些被分配的对象(可达的,却是无用的)无法被gc回收。内存溢出:程序要求的内存超出了系统所能分配的范围(比如:栈满还入栈出现上溢,栈空还出栈出现下溢)可以看出内存泄漏是内存溢出的一种诱因,但不是唯一因素。(2)Java存在内存泄漏:Java判断内原创 2017-06-27 14:03:20 · 8779 阅读 · 1 评论 -
Hotspot g1垃圾回收器
https://my.oschina.net/hanshubo/blog/380238?p={{currentPage-1}}G1垃圾收集器HotSpot JDK 7从update 4开始引入了G1垃圾收集器。G1收集器是服务器风格的垃圾回收器,主要针对多处理器机器上占用大量内存的应用。G1能缩短暂停时间,也能提供高吞吐量,可预测的停顿时间模型。原创 2017-08-08 15:35:38 · 924 阅读 · 0 评论 -
对象的内存布局和访问方式
1、对象的内存布局:(1)对象头(对象的设置信息、指向类元数据的指针、数组的长度)(2)实际数据(因虚拟机而异hotspot:longdouble,int,short/char,byte/boolean,oop,即相同宽度的字段分配到一起,然后父类的变量在子类之前。)(3)对象填充(8的整数倍)2、对象访问方式:取决于虚拟机实现,主流的方式有使用句柄和直接指针句柄:指针的指原创 2017-06-11 20:08:14 · 244 阅读 · 0 评论 -
*强引用,软引用,弱引用,虚引用
在JDK1.2之前,Java中的引用的定义很传统:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。这种定义太过狭隘,一个对象在这种定义下只有被引用或者没有被引用两种状态,在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(StrongReference)、软引用(SoftReference)、弱引用(Weak原创 2017-05-15 10:47:29 · 251 阅读 · 0 评论 -
Hotspot垃圾回收
从J2SE5.0开始,HotSpotJVM共包含四种垃圾收集器,它们全部基于分代算法。一、代的划分 HotSpotJVM中内存被划分为三代:新生代(younggeneration)、老年代oldgeneration)和永久代(permanentgeneration)。从逻辑上讲,新生代和老年代共同构成了Java堆,而永久代则被称为方法区(methodarea)。除了一些大对原创 2017-05-15 11:29:05 · 539 阅读 · 0 评论 -
class文件结构
Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有添加任何分隔符。当遇到需要占用8位字节以上空间的数据项时,则会按高位在前的方式分割成若干个8位字节进行存储。 Class文件结构中只有2种数据类型:无符号数和表。无符号数, 属于基本的数据类型,以u1、u2、u4、u8来分别表示1个字节、2个字节、4个字节和8个字节的无符号数,原创 2017-05-15 19:27:05 · 368 阅读 · 0 评论 -
Class类
一、认识Class类 反射机制允许在运行时发现和使用类型的信息。在Java中用来表示运行时类型信息的对应类就是Class类,也继承Object类其内声明了数个应该在所有Java类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class类的对象。Class类样继承自Object,其实体用以原创 2017-06-29 10:52:58 · 565 阅读 · 0 评论 -
虚拟机字节码执行引擎1
编译器讲源代码转成字节码,那么字节码如何被执行的呢?这就涉及到了JVM的字节码执行引擎,执行引擎负责具体的代码调用及执行过程。就目前而言,所有的执行引擎的基本一致:输入:字节码文件。处理:字节码解析。输出:执行结果。不同的虚拟机实现里面,执行引擎在执行Java代码时可能有解释执行和编译执行两种选择。物理机的执行引擎是由硬件实现的,和物理机的执行过程不同的是虚拟机的执行引擎由于自己实现的。一原创 2017-05-16 10:47:58 · 277 阅读 · 0 评论 -
JVM中类的卸载机制
类的生命周期 加载、连接(验证、准备、解析)、初始化、使用、卸载当Sample类被加载、连接和初始化后,它的生命周期就开始了。 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期。 由此可见,一个类何时结束生命周期,取决于代表它的Class对象原创 2017-06-22 17:07:43 · 1096 阅读 · 0 评论 -
触发Full GC及应对策略
堆内存划分为新生代和老年代空间。从新生代( Eden 和 2个Survivor)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC(新生、老年、永久)是对整个堆来说的,包括了对永久代即方法区的回收(JDK8中无永久代),出现Full GC的时候经常伴随至少一次的Minor GC,但非绝对的。Major GC的速度一般会比Minor GC慢10倍以上。 二、原创 2017-06-23 09:44:36 · 637 阅读 · 0 评论 -
对象是否存活
(1)引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器减1;任何时刻计数器都为0的对象就是不可能再被使用的。实现简单,判断效率高,Java没有选用主要因为它很难解决对象相互循环引用的问题。Java采用的方式:(1)可达性分析:"GCRoots"的对象作为起始点,从这些节点开始向下搜索,当一个对象到GCRoots没有任何引用链相连时,则原创 2017-06-11 20:42:01 · 261 阅读 · 0 评论 -
*对象的创建
创建对象语句Clazzinstance=newClazz();包含的主要过程包括了类加载检查、对象分配内存、并发处理、内存空间初始化、对象设置、执行init方法等。主要流程如下:1.类加载检查JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类的加原创 2017-06-11 19:29:51 · 331 阅读 · 0 评论 -
jvm垃圾回收算法
1.对象是否存活(1)引用计数器法给对象添加一个引用计数器,每引用一次计数器+1,引用失效时计数器-1,当计数器计数为0时,对象不可能在被引用。该方法无法解决对象间循环引用问题,所以jvm并没有采用这种方式(2)可达性分析Java采用可达性分析算法判断对象是否存活的。通过一系列名为"GCRoots"的对象作为起始点开始向下搜索,搜索所走过的路径称为引用链(Reference原创 2017-05-15 09:00:30 · 252 阅读 · 0 评论