![](https://img-blog.csdnimg.cn/20200210210341615.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Jvm
在入门Java很久很久,对于JVM的了解还只是停留在概念上,所以花了些时间去了解Jvm更深层、更有意思的一些方方面面
黑白键的约定
做一个心无旁骛的搬砖人
展开
-
G1杂谈
在之前的文章中提到了四种垃圾回收器:SerialGC、ParallelGC、CMS和G1。对于这四种垃圾回收器垃圾在新生代和老年代在不足时触发的垃圾回收却有所不同。SerialGC新生代内存不足发生的垃圾回收:Minor GC。老年代内存不足发生的垃圾回收:Full GC。ParallelGC新生代内存不足发生的垃圾回收:Minor GC。老年代内存不足发生的垃圾回...原创 2020-03-25 22:04:29 · 110 阅读 · 0 评论 -
Garbage First——G1垃圾回收器
Garbage First俗称G1,2004年被提出,2006年JDK6体验,2012年JDK7.0官方支持,再到2017年JDK9默认的垃圾回收器。在JDK9中废弃了CMS垃圾回收器,从而说明G1取代了CMS垃圾回收器。G1同时注重吞吐量和低延迟,也属于并发的垃圾回收器。G1也适合超大堆内存,将堆内存划分为多个大小相等的Region,每个区域都是1、2、4、8M的大小,每个区域都可以独立的作...原创 2020-03-24 22:35:19 · 305 阅读 · 0 评论 -
垃圾回收器
垃圾回收器可以分为三类:串行的垃圾回收器、吞吐量优先的垃圾回收器和响应时间优先的垃圾回收器。串行的垃圾回收器,底层是一个单线程的垃圾回收器,也就是说在进行垃圾回收时,其他的线程会暂停。使用场景是堆内存较小的时候,适合个人电脑(CPU个数少)。而吞吐量优先的垃圾回收器和响应时间优先的垃圾回收器,则是一个多线程的垃圾回收器,适合堆内存较大,需要多核CPU来支持。显然多核CPU都是服务器,即多用在服...原创 2020-03-23 22:49:52 · 167 阅读 · 0 评论 -
垃圾回收案例——GC分析
GC 分析首先运行一段空的代码,并设置虚拟机参数:“-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc” 。public class Demo { private static final int _512KB = 512*1024; private static final...原创 2020-03-18 22:08:28 · 589 阅读 · 0 评论 -
垃圾回收——分代回收
分代垃圾回收在《垃圾回收算法》中介绍了三种垃圾回收算法,但实际的JVM虚拟机它不会单独采用某一种算法,它结合前面的三种算法协同工作,具体的实现就是虚拟机中称之为分代的垃圾回收机制,它把我们的堆内存整个区域划分了两块,一个叫新生代,一个叫老年代。新生代又进一步划分为伊甸园、幸存区From和幸存区To。为什么要做这样的一个区域划分?主要是因为在Java中有的对象是需要长时间使用,长时间使用的对...原创 2020-03-17 21:50:27 · 310 阅读 · 0 评论 -
垃圾回收算法
在上一篇文章《Java知识学习——垃圾回收》中写到了如何判断一个对象是否可以被回收,但是具体的回收还是要依赖回收方面的算法。常见的有三种:标记清除、标记整理和复制。标记清除算法分为两个阶段。第一阶段先标记,看看哪些对象可以是垃圾,第二步就是清除操作,所谓的清除就是把这个垃圾对象所占用的空间给它释放,释放并不是将整个内存每个字节进行清零操作,它只需要把对象占用内存起始结束地址记录下来,放入一个空...原创 2020-03-17 00:01:22 · 80 阅读 · 0 评论 -
Java知识学习——垃圾回收
如何判断对象是否可以回收?判断对象是否可以回收,有两种方法:引用计数法和可达性分析算法。引用计数法,是指只要一个对象被其他对象引用,就让这个对象的计数加一,如果引用了两次就让这个计数加二,如果某一个变量不在引用它,就让其计数减一,当计数变为0的时候,就说明没有再被引用,就可以作为垃圾被回收。但是引用计数法存在了一个重要的弊端,也就是循环引用的问题,现有两个对象A和B,对象A在引用B,B的计...原创 2020-03-03 00:42:13 · 117 阅读 · 0 评论 -
Java知识学习——直接内存
对于直接内存,前面在说JVM内存结构的时候,并没有一个区域叫做直接内存,都是方法区、堆和栈。直接内存并不是属于JVM的内存管理,而是属于系统的内存管理,即直接内存是操作系统的内存。对于直接内存定义如下:常见于NIO操作时,用于数据缓冲区 分配回收成本较高,但读写性能高 不受JVM内存回收管理在NIO有一个经常用的类——ByteBuffer,就是直接使用的直接内存,通过ByteBuffer...原创 2020-02-27 23:54:13 · 358 阅读 · 0 评论 -
Java知识学习——方法区(三)
StringTable在上一篇文章中我们了解了StringTable,也很清楚地了解StringTable具有下面的几大特性:常量池中的字符串仅是符号,第一次用到时才变为对象。 利用串池的机制,来避免重复创建字符串对象。 字符串变量拼接的原理是StringBuilder(1.8)。 字符串常量拼接的原理是编译期间的优化。除此之外,StringTable还具有可以使用intern方法...原创 2020-02-24 22:46:02 · 108 阅读 · 0 评论 -
Java知识学习——方法区(二)
运行时常量池一个二进制字节码文件包括了三个部分:类的基本信息、常量池、类方法定义(包括了虚拟机指令)。如果想查看一个类的二进制字节码的信息,可以使用Javap -v 字节码文件 来查看相应的信息。下面就是一个简单的Helloword的Java Demo对应的二进制字节码信息。Classfile /F:/JavaProject/day_12/src/_01Calender/SayHello...原创 2020-02-23 23:35:37 · 89 阅读 · 0 评论 -
Java知识学习——方法区(一)
什么是方法区?前面了解了JVM内存结构中的程序计数器、虚拟机栈、本地方法栈和堆之后,还有最后一个内存结构——方法区。方法区从名字上看与我们类的方法有关,确实如此,但是还不是很完整的概括,对于方法区的定义各有千秋,但在JVM规范中是这样定义的。从其定义,首先可以得到,方法区是所有线程共享的区域。其次,在方法区中存放了跟类结构的相关信息(运行时常量池),包括成员变量、方法数据,成员方法...原创 2020-02-23 22:00:11 · 185 阅读 · 0 评论 -
Java知识学习——堆
前面所了解的程序计数器、虚拟机栈、本地方法栈都有一个共同的特点,那就是线程私有的。而今天了解的堆和本地方法区都是线程共享的区域。堆(Heap),通过new关键字,创建的对象都会放在堆内存中,有两大特点:线程共享,所以堆中的对象都需要考虑线程安全问题,之前说的虚拟机栈中的局部变量都是线程私有的,只要局部变量不逃出方法的作用范围,它就是线程安全的。但是堆则是不一样的,堆中的对象都需要考虑线程安全的...原创 2020-02-20 22:26:51 · 134 阅读 · 0 评论 -
Java知识学习——虚拟机栈与本地方法栈
虚拟机栈,顾名思义,与我们熟知的数据结构——栈一样。虚拟机栈就是线程运行时所需要的空间,每一个栈内又是以多个栈帧所构成,什么是栈帧?一个栈帧对应了一次方法的调用,即每个方法运行时所需要的内存就是栈帧,方法运行时方法参数、局部变量、返回地址这些都需要占用空间的。栈和栈帧是怎么联系的呢?例如一段代码在执行的时候调用第一个方法,就会给第一个方法分配一个空间并压入栈中,当第一个方法执行完成之后,就会把这个...原创 2020-02-19 23:40:36 · 292 阅读 · 0 评论 -
Java知识学习——程序计数器
JVM内存结构组成部分包括程序计数器、虚拟机栈、本地方法栈、堆、方法区。首先我们来看程序计数器(PC Register),再了解程序计数器的作用之前,我们先分析下面的代码。很明显图中右侧是Java源代码,Java源代码是不能直接执行运行的,需要经过编译,即编译成左侧的二进制字节码,主要是JVM指令,正是因为这些JVM指令在不同的操作系统上都是一致的,所以Java才有跨平台的操作。...原创 2020-02-11 23:30:10 · 330 阅读 · 0 评论 -
Java知识学习——什么是JVM?
对于Java学习者来说,JVM不会陌生,从一开始用Java编写的Hello World开始,JVM就与我们时时刻刻相关联。什么是JVM?Java Virtual Machine指的是Java程序的运行环境,用Java编写的源代码,经过Javac编译成Class字节码文件,然后经过程序加载到JVM中即可运行,确切的说是Java二进制字节码的运行环境。JVM是Java一次编写到处运行的基础,J...原创 2020-02-10 21:33:59 · 293 阅读 · 0 评论