JDK

java8 Stream的实现原理 (从零开始实现一个stream流)

喜欢而已 提交于 2020-10-24 11:03:51
1.Stream 流的介绍 1.1 java8 stream介绍   java8新增了stream流的特性,能够让用户以函数式的方式、更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算。 1.2 从零开始实现一个stream流   相信很多人在使用过java8的streamAPI接口之后,都会对其实现原理感到好奇,但往往在看到jdk的stream源码后却被其复杂的抽象、封装给弄糊涂了,而无法很好的理解其背后的原理。究其原因,是因为jdk的stream源码是高度工程化的代码,工程化的代码为了效率和满足各式各样的需求,会将代码实现的极其复杂,不易理解。   在这里,我们将抛开jdk的实现思路, 从零开始实现一个stream流 。   我们的 stream流 同样拥有 惰性求值 , 函数式编程接口 等特性,并 兼容jdk的Collection等数据结构 (但不支持并行计算 orz)。   相信在亲手实现一个stream流的框架之后,大家能更好的理解流计算的原理。 2.stream的优点   在探讨探究stream的实现原理和动手实现之前,我们先要体会stream流计算的独特之处。   举个例子: 有一个List<Person>列表,我们需要获得年龄为70岁的前10个Person的姓名。 过程式的解决方案:    稍加思考,我们很快就写出了一个过程式的解决方案( 伪代码 ):

JVM学习笔记(二)——GC

[亡魂溺海] 提交于 2020-10-24 08:35:35
垃圾收集器 垃圾收集器需要完成三件事情 哪些内存需要回收 什么时候回收 如何回收 哪些内存需要回收 判断对象是否存活 引用计数法(不是主流) 算法:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一,当引用失效时,计数器值就减一。任何时刻 计数器为零 的对象就是 不可能再被使用的 。 优点:原理简单,判定效率也很高。 缺点: 很多例外情况需要考虑 ,要配合大量额外处理才能保证正确地工作,如该算法就很难解决 对象之间相互循环引用 的问题。 可达性分析法 通过一系列称为“GC Roots”的根对象作为初始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者从GC Roots到这个对象不可达时,则证明此对象不肯能再被使用。 引用的概念 JDK1.2版之前:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称该reference数据是代表某块内存、某个对象的引用。 JDK1.2版之后:将引用分为强引用、软引用、弱引用和虚引用。P71 强引用:指在程序中普遍存在的引用赋值,即类似“Object obj = new Object()",无论再任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。 软引用

干货分享丨jvm系列:dump文件深度分析

匆匆过客 提交于 2020-10-24 01:42:56
摘要: java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢? JVM dump java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?我们一步一步来 获取JVM dump文件 获取dump文件的方式分为主动和被动 i.主动方式: 1.利用jmap,也是最常用的方式:jmap -dump:[live],format=b,file= 2.利用jcmd,jcmd GC.heap_dump 3.使用VisualVM,可以界面操作进行dump内存 4.通过JMX的方式 MBeanServer server = ManagementFactory.getPlatformMBeanServer(); HotSpotDiagnosticMXBean mxBean = ManagementFactory.newPlatformMXBeanProxy(server, " com.sun.management:type=HotSpotDiagnostic " , HotSpotDiagnosticMXBean. class ); mxBean

面试官:我就问了一个JVM性能调优,没想到他能吹半个小时

僤鯓⒐⒋嵵緔 提交于 2020-10-24 00:40:02
一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,由虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。 年轻代(New):年轻代用来存放JVM刚分配的Java对象 年老代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代 永久代(Perm):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。 New又分为几个部分: Eden:Eden用来存放JVM刚分配的对象 Survivor1 Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。 2.垃圾回收算法 垃圾回收算法可以分为三类,都基于标记-清除(复制)算法: Serial算法(单线程) 并行算法 并发算法

jstat命令详解

心不动则不痛 提交于 2020-10-23 17:38:22
jstat命令使用 jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 注意:使用的jdk版本是jdk8. 类加载统计: C: \Users \Administrator >jstat -class 2060 Loaded Bytes Unloaded Bytes Time 15756 17355.6 0 0.0 11.29 1 2 3 1 2 3 Loaded:加载class的数量 Bytes:所占用空间大小 Unloaded:未加载数量 Bytes:未加载占用空间 Time:时间 编译统计 C:\Users\Administrator>jstat -compiler 2060 Compiled Failed Invalid Time FailedType FailedMethod 9142 1 0 5.01 1 org/apache/felix/resolver/ResolverImpl mergeCandidatePackages 1 2 3 1 2 3 Compiled:编译数量。 Failed:失败数量 Invalid:不可用数量 Time:时间 FailedType:失败类型 FailedMethod:失败的方法 垃圾回收统计 C: \Users

探索JVM的底层秘密(一)——如何正确理解Java的常量池

断了今生、忘了曾经 提交于 2020-10-23 15:52:38
如果你点开了本篇文章,那么恭喜你发现宝藏了! 博主接下来将会更新整个系列的 《探索JVM的底层秘密》 文章,为大家完整的剖析JVM的底层原理。 作者最近在优化JVM内存模型这方面的内容,发现自己对于Java中的常量池的理解有点零碎,做个总结,于是就有了这篇文章。本篇文章所有知识点基于jdk8。 jdk6、jdk7不适用,如果有疑问,欢迎在评论区留言。废话不多说,直接上代码。 比如你写了一段这样的Java代码,JVM是如何处理的呢? 1、Java代码 public class StringTest2 { String name = "子牙" ; public static void main ( String [ ] args ) { StringTest2 obj = new StringTest2 ( ) ; } } 2、class文件之常量池(图1) 3、默认构造方法字节码(图2) 常量池分类 1、class文件中的常量池 这个常量池中主要存放两大类常量:字面量、符号引用。 字面量即文本字符串,如index=10的Code、index=11的LineNumberTable……还有声明为final的常量。 符号引用则属于编译原理方面的概念,包含三类: 类和接口的全限定名,如index=4存放的是CONSTANT_Class_info结构,指向的是类的全限定名 字段的名称和描述符

cmd运行java程序找不到或无法加载主类解决办法

筅森魡賤 提交于 2020-10-23 11:04:31
今天又重新回顾了一遍java的知识,在测试中遇到了一个问题,如下图 出现这种问题可能有以下几种原因: Java类中包含包(package)名,将包名去掉即可。 Java类中无主方法,需要添加程序入口的主方法。 未对jdk进行环境配置。 但是我研究了半天仍没搞出来是什么原因,最终几次修改jdk环境变量最终运行成功了,可能是jdk没有完全配置好的原因。下面将环境jdk环境的配置列出,有问题的小伙伴们可以试试: JAVA_HOME: D:\Java\jdk-8(这里设置为你的jdk安装目录) classpath: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; Path: %JAVA_HOME%\bin 不懂jdk环境如何配置的小伙伴可以自行百度哦! 来源: oschina 链接: https://my.oschina.net/u/4403110/blog/4296264

美腻了!Java资深架构师带你深度学习字节跳动的亿级流量+高并发

戏子无情 提交于 2020-10-23 10:49:18
随着软件行业的飞速发展,互联网公司对开发者的技能要求也越来越高。而高并发、网络编程、微服务、海量数据的处理等技能,是每一个开发者进阶时的必学知识。为了帮助初级开发者快速掌握这些实用技术,字节跳动架构师总结了一份以“理论+范例”的形式对各个知识点进行了详细的讲解,力争让读者在实践中快速掌握相关知识的PDF。 这份PDF可以划分为三大部分:并发的底层核心技术(第2~6章),互联网应用框架(第7~13章),数据处理(第14~18章)等三部分对高并发系列技术做了系统讲解,几乎所有的知识点都配有详细的案例代码、运行流程的解读及运行结果的截图。 这份PDF作为字节跳动架构师的经典之作,不仅是作者知识的总结,同时还加入了作者自身很多的实战经验!这份PDF现在免费公开,让更多的人接触到了高并发架构,不禁让人肃然起敬,这份PDF的免费获取方式在文末! 并发的底层核心技术篇 第1章高并发概述+第2章系统分析与大型互联网架构设计 第3章高并发相关JVM与JDK新特性案例讲解 本章讲解JVM的底层模型,并介绍JVM对解决高并发问题提供的支持。最后为了让读者能更好地理解本书中的案例代码,还会阐述JDK 8中新增的Lambda和Stream等新特性的使用。 第4章实战解析多线程并发包 第5章分布式网络编程核心技术-远程调用 当单服务器的负载超限时,通常会搭建集群服务或将系统拆分成分布式的结构

一些让IntelliJ IDEA使用更顺手的必要设置

不问归期 提交于 2020-10-23 07:28:17
众所周知IntelliJ IDEA堪称神器,该软件以其强大丰富的功能非常受欢迎,但是总有点差强人意的地方,想要IntelliJ IDEA使用起来更顺手,这些设置您非常有必要安排上,具体操作来一起看看吧~ IntelliJ IDEA使用更顺手,这些必要设置安排上~ 打开File >Settings >Editor >File encodings,将如下位置设置为 UTF-8 另外将Transparent native-to-ascii conversion勾选,即自动转换 ASCII 编码。 其工作原理是:在文件中输入文字时他会自动的转换为 Unicode 编码,然后在 idea 中发开文件时他会自动转回文字来显示。这样做是为了防止文件乱码。这样 properties 文件,一般都不会出现中文乱码! JDK 找到File>Project Structure > Project > Project SDK,创建或选择设置好 SDK 字体 找到File > Settings > Editor > Font,设置合适的字体和大小 修改代码提示、补充快捷键 eclipse 用习惯的同学会习惯性的用Alt + /进行提示,首先打开File>Settings,搜索Cyclic Expand Word,快捷键Alt+/删除(Remove Alt+/) 然后将 Basic 的 Ctrl+

为什么大部分程序员还在用Java 8?

喜欢而已 提交于 2020-10-23 05:38:11
不说 Android,Java 本身都很碎片化。尽管 Java 升级换代,但于开发者来说,还是紧紧地抱着 Java 8 不放,这是为什么呢?一起来看下吧。 以下为译文: 近日的调查结果显示,绝大多数开发人员的主要应用程序中使用的还是 Java 8。 数据来源: https://snyk.io/blog/jvm-ecosystem-report-2018/ 在Java 8之前,用户接受更高版本的Java的过程非常缓慢,特别是在企业中,因为在生产环境中接受新版本Java非常困难。 而引入了Lambda表达式和流的Java 8对许多开发人员来说都非常有吸引力。同时,微服务、持续发布实践和更好的自动化测试也让接受新版本语言变得更容易,风险比以前更小。 那么,鉴于这些因素,为什么从Java 9开始每年两次发布新版本的情况下,开发人员还在坚持使用Java 8呢?目前Java最新的版本是Java 12,然而很少有人使用9~12的版本。推荐: Java 12 正式发布,8大新特性! 估计你能猜到这其中的原因:“很复杂”。Java 8之后的版本发生了很多变化,这可能会导致各个公司在Java升级上举棋不定。 6 个月一次的发布节奏 从2017年9月发布Java 9开始,Oracle每六个月就会发布一个新版本的JDK,具体来说是每年的三月和九月。现在持续发布大行其道