- 博客(29)
- 资源 (1)
- 收藏
- 关注
原创 深入探究数据结构与算法系列——选择排序
上两篇博客中我们已经学习了什么是冒泡排序和它的性能分析,也知道冒泡排序是算法的技术排序,那么接下来的选择排序就是在冒泡排序的基础上进一步的升级优化。其实不同算法他们的逻辑还是有相当的叙别的,这决定了算法的性能问题。但凡是学习一门语言或者算法,都不能一蹴而就,慢慢学习其原理的重要性。 下面我们来看看什么是选择排序: 选择排序是每一次从待排序的数据元素中选出最小的一个元...
2018-06-25 14:46:32 355
原创 数据结构与算法系列——冒泡排序进阶
博主我在上一篇博客中已经详细地讲解了关于冒泡排序算法的相关知识了,不过接下来的这篇博客将会进一步地阐述冒泡排序中需要注意的知识点,这一点我觉得相当重要,所以在此又开了进阶篇,那么接下来我们将会从 对比次数,交换次数,元素地址还有已经排好序的几个方面详细讲解。 首先我们先把算法给展示出来:如下/** * 比较次数 交换次数 变量 (注意,已经排好序的情况) * ...
2018-06-25 10:38:07 477 1
原创 深入探究Java数据结构与算法系列(三)——冒泡排序(基础算法)
引言: 在切入到算法这个领域之前,像很多人一样都会去了解这个算法的原理以及它的实现代码。也正是说明了它是总多算法当中的基础中基础,也是带领我们深入到哥哥算法当中不可或缺的一个步骤,如果有过一点算法基础的人或缺会有个印象,冒泡排序用到了两个for循环,那么一般我们都认为它的时间复杂度为O(N2),,那么今天我们来探究一下冒泡排序算法的实现。 基础原理: ...
2018-06-11 11:41:10 241
原创 用类的思想封装一个数组,实现其基本功能
package array;import com.sun.istack.internal.NotNull;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * @author hegx */public class Array { /** * 日志变量 */ private ...
2018-06-08 12:05:41 729
原创 深入研究JAVA数据结构跟算法系列(二)——数组进阶(数组移除元素)
引言: 笔者在学习Java数据结果跟算法的过程中,知道数组在数据结构跟算法中是很中烟的存在,只要对数组有相当的认知以后才能说自己对这一模块才能说熟悉掌握,单反在任何语言当中,学习用本质看现象才能更好的去解决更多的问题,也是走向更高的一层打下扎实的基础。 那么我们说用过本质看现象是有相当的要求,不扯了。下面我们来看看Java数据结构当中的数组是怎么实现移除或者说删除数组元素的,在Arra...
2018-06-08 11:52:55 1265
原创 Java虚拟机常见的问题解决(一)
错误:Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.Conflicting collector combinations in option list; please refer to the release notes for th...
2018-06-07 15:56:08 2335
原创 深入探究Java数据结构和算法(二)——数组
引言: 存在即理,数组是数据结构的鼻祖,学习数据结构后者说任何语言的数据机构都离不开数组,只是不同的语言底层实现数组的方式不尽相同。 有过JVM相关知识的经验,我们都会知道,Java数组实例是存放在堆内存当中的。Java数组介绍在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型。 ①、数组的声明 第一种方式:数据类型 [] 数组名称 = ne...
2018-06-06 11:45:38 247
原创 深入探究Java数据结构和算法(一)——简介
引言: 好吧,一直以来搞Java开发都没有很好的系统去学习过这方面的知识,今天首开第一篇博客来激励自己前进,不断地去探究Java数据结构与算法方面的知识,但是我相信这方面的东西都是日积月累的,并不是想Java虚拟机一样,两三个星期就掌握得差不多,如果你能力很强的话,而且很用心 一个星期也差不多了,但是还是要反反复复的重温才能更加的巩固。 曾经我有一位同事跟我说是在实际开发中...
2018-06-06 10:02:04 517 2
原创 Intellj idea代码提示快捷键没有效果
引言: 额这个问题存在很久了,不过因为有回车倒退的功能所以一直都忽略这个问题,今天我一个朋友问了我这个体验很差,idea太垃圾了了没有eclipse好用,不出来就是有问题,那么解决就是了。 问题分析图如下: 1.2.解决方案:点击 文件菜单(File) –> 点击 设置(Settings… Ctrl+Alt+S), –> 打开设置对话框。在左侧的导航框中点击 KeyM...
2018-06-05 17:07:03 2909 2
转载 深入理解Java虚拟机系列——Java虚拟机OOM之方法区溢出
方法区用于存放 Class 的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。 对于这个区域的测试,基本的思路是运行时产生大量的类去填满方法区,直到溢出。虽然直接使用 JavaSE API 也可以动态产生类(如反射时的GeneratedConstructorAccessor 和动态代理等),但在本次实验中操作起来比较麻烦。在代码清单 2-5 中,笔者借助 CGLib①直接操作字节码运行...
2018-06-05 11:07:58 642
转载 Java虚拟机OOM之虚拟机栈和本地方法栈溢出
一、在 Java 虚拟机规范中,对虚拟机栈这个区域规定了两种异常状况:(1)如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常; (2)如果虚拟机栈可以动态扩展(当前大部分的 Java 虚拟机都可动态扩展,只不过 Java 虚拟机规范中也允许固定长度的虚拟机栈),当扩展时无法申请到足够的内存时会抛出 OutOfMemoryError 异常。 (3)与虚拟机...
2018-06-05 10:52:27 1495
原创 Java虚拟机OutOfMemoryError 异常详解及解决方法
上图是一张Java运行时的内存分布图,可知虚拟机内存都有发生OutOfMemoryError(下文称 OOM)异常的可能,作为一个合格的Java开发人员,我们应该做到的是:(1)第一,通过代码验证 Java 虚拟机规范中描述的各个运行时区域储存的内容; (2)第二,遇到内存溢出的时候,应该可以找打具体的位置,并进行合理的解决;下边就聊一下 OOM:一、Java 堆溢出我们知道Java 堆用于储存对...
2018-06-05 10:42:26 1364
原创 深入理解Java虚拟机系列——内存溢出跟内存泄露的区别
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory! 以发生的方式来分类,内存泄漏可以分为4类: 1. ...
2018-06-05 10:36:37 906
原创 深入理解Java虚拟机系列——Class文件结构
今天来写一写.class文件的格式,学习Java虚拟机一段时间后,发现其实对class文件并不是很了解,但是这的确是虚拟机环节中重要的一部分,了解class文件的结构对了解java虚拟机有更深的体会。 简单介绍一下Class类文件结构(常量池主要存放的是那两大常量?Class文件的继承关系是如何确定的?字段表、方法表、属性表主要包含那些信息?)1 概述 计算机虽然只能识别0和...
2018-06-04 14:20:56 329
原创 深入理解JAVA虚拟机——JVM的类加载时机
类加载过程中每个步骤的顺序我们已经知道,类加载的过程包括:加载、连接、初始化,连接又分为:验证、准备、解析,所以说类加载一共分为5步:加载、验证、准备、解析、初始化。其中加载、验证、准备、初始化的开始顺序是依次进行的,这些步骤开始之后的过程可能会有重叠。 而解析过程会发生在初始化过程中。 类加载过程中“初始化”开始的时机JVM规范中只定义了类加载过程中初始化过程开始的时机,加载、连接过程都应该在初...
2018-06-04 10:17:02 164
原创 深入理解JAVA虚拟机——JVM的本地方法栈
对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,但不止如此,它还可以做任何它想做的事情。 本地方法本质上时依赖于实现的,虚拟机实现的设计者们可以自由地决定使用怎样的机制来让Java程序调用本地方法。 任何本地方法接口都会使用某...
2018-06-04 10:11:10 1101
原创 深入理解Java虚拟机系列——JVM的堆分配
为了展示虚拟机如何使用方法区中的信息,下面来举例说明:class Lava { private int speed = 5; void flow(){ }} public class Volcano { public static void main(String[] args){ Lava lava = new L...
2018-06-04 10:08:01 207
原创 深入理解Java虚拟机系列——JVM的类装载子系统
在JAVA虚拟机中,负责查找并装载类型的那部分被称为类装载子系统。 JAVA虚拟机有两种类装载器:启动类装载器和用户自定义类装载器。前者是JAVA虚拟机实现的一部分,后者则是Java程序的一部分。由不同的类装载器装载的类将被放在虚拟机内部的不同命名空间中。 类装载器子系统涉及Java虚拟机的其他几个组成部分,以及几个来自java.lang库的类。比如,用户自定义的类装载器是普通的Java...
2018-06-04 09:57:37 263
原创 深入理解JAVA虚拟机系列——JVM的类装载子系统
在JAVA虚拟机中,负责查找并装载类型的那部分被称为类装载子系统。 JAVA虚拟机有两种类装载器:启动类装载器和用户自定义类装载器。前者是JAVA虚拟机实现的一部分,后者则是Java程序的一部分。由不同的类装载器装载的类将被放在虚拟机内部的不同命名空间中。 类装载器子系统涉及Java虚拟机的其他几个组成部分,以及几个来自java.lang库的类。比如,用户自定义的类装载器是普通的Jav...
2018-06-04 09:54:27 200
原创 深入理解JAVA虚拟机——JVM的数据类型(以及按引用传递法则)
Java虚拟机是通过某些数据类型来执行计算的,数据类型可以分为两种:基本类型和引用类型,基本类型的变量持有原始值,而引用类型的变量持有引用值。 Java语言中的所有基本类型同样也都是Java虚拟机中的基本类型。但是boolean有点特别,虽然Java虚拟机也把boolean看做基本类型,但是指令集对boolean只有很有限的支持,当编译器把Java源代码编译为字节码时,它会用int或者byt...
2018-06-01 16:23:51 1591 1
原创 深入理解Java虚拟机系列——JVM常用参数配置
Trace跟踪参数-verbose:gc -XX:+printGC 打印GC的简要信息-XX:+PrintGCDetails 打印GC详细信息-XX:+PrintGCTimeStamps 打印CG发生的时间戳-Xloggc:log/gc.log 指定GC log的位置,以文件输出XX:+TraceClassLoading 监控类的加载-XX:+PrintClassHistogram ...
2018-06-01 16:10:45 169
原创 深入理解Java虚拟机——JVM的类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类加载的规则:全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自...
2018-06-01 16:04:29 296
原创 深入理解Java虚拟机——JVM的GC实现详解
新生代中的98%对象都是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认Eden和Sur...
2018-06-01 15:39:14 786
原创 深入理解Java虚拟机系列——JVM的GC理论详解
GC的概念 GC:Garbage Collection 垃圾收集。这里所谓的垃圾指的是在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM(堆溢出)。内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈的操作,每个栈帧中分配多少内存基本是在类结构确定下来时就...
2018-06-01 15:25:51 1254
原创 深入理解Java虚拟机系列——JVM的栈内存
每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。 某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。在线程执行一个方法时,它会跟踪当前类和当前常量池。此外,当虚拟机遇到栈内操作指令时,它...
2018-06-01 15:00:15 891 1
原创 深入理解Java虚拟机系列——JVM的基本结构
首先,当一个程序启动之前,它的class会被类装载器装入方法区,执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数在java栈中预留一个栈帧(每个方法都对应一个栈帧),然后开始跑main函数,main函数里的代码被执行引擎映射成本地操作系统里相应的实现,然后调用本地方法接口,本地方法运行的时候,操纵系统会...
2018-06-01 14:39:01 191
原创 深入理解Java虚拟机——JVM的生命周期
package test; public class JVMTestLife { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { ...
2018-06-01 14:07:46 264
原创 深入了解Java虚拟机系列——JVM的启动流程
JVM工作原理和特点主要是指操作系统装入JVM,是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.1.创建JVM装载环境和配置2.装载JVM.dll3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例4.调用JNIEnv实例装载并处理class类。一.JVM装入环境,JVM提供的方式是操作系统的动态连接文件.既然是文件那就一个装入路径的问题,Java是怎么找这个路径...
2018-06-01 11:55:21 2306 3
原创 深入理解Java虚拟机系列(1)——什么叫做JVM与JVM规范
引言 (1)内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题。 (2)可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个“不懂内存”的帽子,这着实有点让人难以接受。毕竟JAVA当中没有m...
2018-06-01 11:26:01 1714 4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人