猫宁i

趁着年轻,好好生活,用心折腾。


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 书单

  • 搜索

深入理解 Java 虚拟机(三):内存分配与回收策略

发表于 2018-08-27 | 分类于 Jvm | 阅读次数:
本文字数统计: 5.8k | 阅读时长 ≈ 5 分钟

概述

Java 技术体系所提倡的自动内存管理最终可以归纳为自动化的解决两个问题:给对象分配内存以及回收分配给对象的内存。关于回收内存这一点,在本系列的第二章介绍了虚拟机中的垃圾收集器体系以及运作原理,本小节我们主要探讨一下 HotSpot 虚拟机在 Java 堆中对象分配、布局和访问全过程以及内存分配与回收策略。

对象的内存分配,往大的方向讲,就是在堆上分配(但也可能经过 JIT 编译后被拆散为标量类型并间接的在栈上分配),对象主要分配在新生代 Eden 区上,如果启动了本地线程分配缓冲,将按线程优先在 TLAB(本地线程分配缓冲)上分配。少数情况下,也可能直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。

本节下面的代码在测试时使用 Client 模式虚拟机运行,没有手工指定收集器组合,换句话说,验证的是在使用 Serial / SerialOld 收集器下(ParNew / SerialOld 收集器组合的规则也基本一致)的内存分配和回收策略。

阅读全文 »

一网打尽 NoSQL:当下 NoSQL 类型、适用场景及使用公司

发表于 2018-07-19 | 分类于 NoSQL | 阅读次数:
本文字数统计: 6.6k | 阅读时长 ≈ 6 分钟

前言

在互联网和大数据的背景下,越来越多的网站、应用系统需要支撑海量数据存储、高并发请求、高可用、高可扩展性等特性要求。传统的关系型数据库 RDBMS 已经难以应对类似的需求,各种各样的 NoSQL(Not Only SQL)数据库凭借易扩展、大数据量和高性能以及灵活的数据模型成功的在数据库领域站稳了脚跟。本文将分析传统数据库的存在的问题,以及几类 NoSQL 如何解决这些问题。在不同的业务场景下,作出正确的数据存储技术选型。

阅读全文 »

Java8 那些事儿(三):Date/Time API(JSR 310)

发表于 2018-06-29 | 分类于 Java | 阅读次数:
本文字数统计: 14k | 阅读时长 ≈ 13 分钟

前言

Java8 引入了新的 Date-Time API(JSR 310)来改进时间、日期的处理。时间和日期的管理一直是最令 Java 开发者痛苦的问题。java.util.Date 和后来的 java.util.Calendar 一直没有解决这个问题(甚至令开发者更加迷茫)。

因为上面这些原因,诞生了第三方库 Joda-Time,可以替代 Java 的时间管理 API。Java8 中新的时间和日期管理 API 深受 Joda-Time 影响,并吸收了很多 Joda-Time 的精华。新的 java.time 包包含了所有关于瞬时时间(Instant),持续时间(Duration),日期(Date),时间(Time),时区(Time-Zone)以及时间段(Period)操作的类。新设计的 API 认真考虑了这些类的不变性(从 java.util.Calendar 吸取的教训),如果某个实例需要修改,则返回一个新的对象。

  • ZoneId: 时区 ID,用来确定 Instant 和 LocalDateTime 互相转换的规则
  • Instant: 用来表示时间线上的一个点
  • LocalDate: 表示没有时区的日期,LocalDate 是不可变并且线程安全的
  • LocalTime: 表示没有时区的时间,LocalTime 是不可变并且线程安全的
  • LocalDateTime: 表示没有时区的日期时间,LocalDateTime 是不可变并且线程安全的
  • Clock: 用于访问当前时刻、日期、时间,用到时区
  • Duration: 用秒和纳秒表示时间的数量

最常用的就是 LocalDate、LocalTime、LocalDateTime 了,从它们的名字就可以看出是操作日期和时间的。

阅读全文 »

Redis 深度探险(一):那些绕不过去的 Redis 知识点

发表于 2018-06-03 | 分类于 Redis | 阅读次数:
本文字数统计: 13k | 阅读时长 ≈ 12 分钟

前言

Redis 是我们工作中接触最多的非关系型数据库,我所在的公司也是 Redis 的深度用户,我们线上的大部分的业务都使用到了 Redis。与传统数据库不同的是 Redis 的数据是存在内存中的,所以存写速度非常快,因此 Redis 被广泛应用于缓存方向。值得注意的是,Redis 也经常用来做分布式锁。Redis 提供了多种数据类型来支持不同的业务场景。除此之外,Redis 支持事务 、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。以前在使用 Redis 的时候,只是简单地使用它提供的基本数据类型和接口,并没有深入研究它底层的数据结构。最近打算重新学习梳理一下 Redis 方面的知识。

本篇是我学习 Redis 系列的开篇,主要内容讲述 Redis 概述及其相关内容,然后介绍一下 Redis 数据结构,最后介绍一下 Redis 对象以及应用场景。

阅读全文 »

Java 并发编程之美(二):线程池 ThreadPoolExecutor 原理探究

发表于 2018-05-03 | 分类于 并发 | 阅读次数:
本文字数统计: 23k | 阅读时长 ≈ 21 分钟

前言

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在 Java 中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这就是 “池化资源” 技术产生的原因。线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程,不用自行创建;使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。但是要做到合理的利用线程池,必须对其原理了如指掌。

阅读全文 »

深入理解 Java 虚拟机(二):JVM 垃圾收集器

发表于 2018-04-27 | 分类于 Jvm | 阅读次数:
本文字数统计: 19k | 阅读时长 ≈ 18 分钟

概述

从上一篇文章中,我们知道了内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈 3 个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构能确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而 Java 堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的是这部分内存。

上一篇文章讲述了 Java 内存区域与内存溢出异常,本章将介绍垃圾收集的算法,然后分析几款 JDK1.7 中提供的垃圾收集器特点以及运作原理。

阅读全文 »

Java8 那些事儿(二):Optional 类解决空指针异常

发表于 2018-04-03 | 分类于 Java | 阅读次数:
本文字数统计: 4.7k | 阅读时长 ≈ 4 分钟

前言

空指针异常是导致 Java 应用程序失败的最常见原因。以前,为了解决空指针异常,Google 公司著名的 Guava 项目引入了 Optional 类,Guava 通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到 Google Guava 的启发,Optional 类已经成为 Java8 类库的一部分。Optional 实际上是个容器:它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供很多有用的方法,这样我们就不用显式进行空值检测。

阅读全文 »

初识 Nginx(二):安装及配置说明

发表于 2018-03-15 | 分类于 Nginx | 阅读次数:
本文字数统计: 7k | 阅读时长 ≈ 6 分钟

前言

在上一篇博文中大概描述了 Nginx 的原理和功能,本篇博文主要讲述 Nginx 的安装步骤,然后介绍一下 Nginx 常用命令,最后对 Nginx 常见配置进行一些简要说明。

阅读全文 »

论编码重要性(二):你所不了解的编码解码技术

发表于 2018-02-03 | 分类于 编码 | 阅读次数:
本文字数统计: 2.3k | 阅读时长 ≈ 2 分钟

前言

在我的工作中,使用爬虫过程中常常会遇到各种各样的编码解码技术,对于网站返回的响应内容,常常需要一眼就要知道该网站用的什么编码技术?需要用什么解码技术进行解码?请求体内容使用了哪种编码技术?本篇是我了解编码系列的后续,主要内容讲述爬虫工作中常见的编码技术。

阅读全文 »

Java 并发编程之美(一):并发队列 Queue 原理剖析

发表于 2018-01-15 | 分类于 并发 | 阅读次数:
本文字数统计: 14k | 阅读时长 ≈ 12 分钟

前言

并发编程是 Java 程序员最重要的技能之一,也是最难掌握的一种技能。而在本人的工作中也经常会接触到并发编程的情况,队列、线程池、线程本地变量等等在本人的工作项目中都有大量的应用,为了更深入的理解并发编程,了解其运行原理,本人决定对工作中接触到的并发编程技术进行进一步的梳理。

本篇是我学习 Java 并发编程系列的开篇,主要内容介绍一下队列 Queue 概念以及方法,然后对工作中常用的几个队列进行分析,介绍其主要使用场景。

阅读全文 »
1…345
猫宁i

猫宁i

趁着年轻,好好生活,用心折腾。
47 日志
16 分类
106 标签
RSS
Links
  • 我的镜像站
  • crossoverJie's Blog
  • Format's Notes
  • 渣博客
  • Sanarous
© 2017 – 2020 猫宁i | 博客全站字数: 655k
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Muse v7.0.1
0%