永红的互联网手记

我相信好代码和好产品改变世界!

0%

为什么会有 GC

本质上是内存资源的有限性,因此需要大家共享使用,手工申请,手动释放。

垃圾收集,不是 Java 语言的伴生产物。早在 1960 年,第一门开始使用内存动态分配和垃圾收集技术的 Lisp 语言诞生。

关于垃圾收集有三个经典问题:

  • 哪些内存需要回收?
  • 什么时候回收?
  • 如何回收?
阅读全文 »

JVM 命令行工具

工具 简介
java Java 应用的启动程序
javac JDK 内置的编译工具
javap 反编译 class 文件的工具
javadoc 根据 Java 代码和标准注释,自动生成相关的API说明文档
javah JNI 开发时, 根据 java 代码生成需要的 .h文件。
extcheck 检查某个 jar 文件和运行时扩展 jar 有没有版本冲突,很少使用
jdb Java Debugger ; 可以调试本地和远端程序, 属于 JPDA 中的一个 demo 实现, 供其他调试器参考。开发时很使用
jdeps 探测 class 或 jar 包需要的依赖
jar 打包工具,可以将文件和目录打包成为 .jar 文件;.jar 文件本质上就是 zip 文件, 只是后缀不同。使用时按顺序对应好选项和参数即可。
keytool 安全证书和密钥的管理工具; (支持生成、导入、导出等操作)
jarsigner JAR 文件签名和验证工具
policytool 实际上这是一款图形界面工具, 管理本机的 Java 安全策略
jps/jinfo 查看 java 进程
jstat 查看 JVM 内部 gc 相关信息
jmap 查看 heap 或类占用空间统计
jstack 查看线程信息
jcmd 执行 JVM 相关分析命令(整合命令)
jrunscript/jjs 执行 js 命令
阅读全文 »

《秒赞》林桂枝

1.你的样子里,有你走过的路,读过的书,看过的风景。

2.想当垃圾吃垃圾,想当辣椒吃辣椒,想当什么自己要想好吃什么。

  • 创建“好东西”文件夹,在里面放好的设计与照片、出色的演讲、有见地的文章、有趣的事物。
  • 准备一个“好东西”本子,随时记录有趣的对话和文字,补充新词汇,不断丰富自己的储备。
  • 将自己认为“有感觉”的词汇记下来,接着将这些词汇分给不同的人和不同的事物,想想这些词该给谁,与什么东西结合最有意思。
  • 读完一本书,写个简短的读书心得;看完一部电影,记录自己的感受。有时间多写,忙的话写几行字也可以。
  • 你记录的点点滴滴将会成为你个人的宝贵资产,你的缪斯女神,更是让你工作顺利、表现优秀的利器。

3.人能想象到的一切都是真实的。——毕加索

阅读全文 »

JVM 运行时数据区概述

内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行。不同的 JVM 对于内存的划分方式和管理机制存在着部分差异。结合 JVM 虚拟机规范,来讨论一下经典的 JVM 内存布局。

Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。而另外一些则是与线程一一对应的,这些与线对应的数据区域会随着线程开始和结束而创建和销毁。

阅读全文 »

类加载子系统作用

  • 类加载子系统负责从文件系统或者网络中加载 Class 文件,Class 文件在文件开头有特定的文件标识(cafebabe)
  • ClassLoader 只负责 Class 文件的加载,至于它是否能够运行,则由 Execution Engine 决定
  • 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区还存放运行时常量池信息,可能还包含字符串字面值和数字常量(这部分常量信息是 Class 文件中常量池部分的内存映射)
阅读全文 »

什么是字节码?

  • 我们平时所说的 Java 字节码,指的是用 Java 语言编译成的字节码。准确的说能在 JVM 平台上执行的字节码格式都是一样的。所以应该统称为 JVM 字节码。

  • 不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的 JVM 上运行。

  • Java 虚拟机与 Java 语言并没有必然的联系,它只与特定的二进制文件格式 .class 文件格式所关联,.class 文件中包含了 Java 虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他的辅助信息。

  • Java bytecode 由单字节(byte)的指令组成,理论上最多支持 256 个操作码(opcode)。 实际上 Java 只使用了200左右的操作码,还有一些操作码则保留给调试操作。详情见:

  • JVM 指令集对照表

阅读全文 »

Java 生态圈

Java 是目前应用最为广泛的软件开发平台之一。随着 Java 以及 Java 社区的不断壮大,Java 也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。

  • 作为一个平台:Java 虚拟机扮演着举足轻重的作用。
    • Groovy、Scala、JRuby、Kotlin 等都是 Java 平台的一部分。
  • 作为一种文化:Java 几乎成为了开源的代名词
    • 第三方开源软件和框架,如,Tomcat、Struts、MyBatis、Spring 等
    • 就连 JDK 和 JVM 自身也有不少开源的实现,如 OpenJDK、Harmony
  • 作为一个社区,Java 拥有全世界最多的技术拥护者和开源社区的支持,有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到 Java 的身影。其应用形式之复杂、参与人数之众也令人咋舌。
阅读全文 »

JDK 16 在 2021 年 3 月 16 日正式发布了,这次发布的主要功能有:

  • JEP 338: Vector API (Incubator)
  • JEP 347: Enable C++14 Language Features
  • JEP 357: Migrate from Mercurial to Git
  • JEP 369: Migrate to GitHub
  • JEP 376: ZGC: Concurrent Thread-Stack Processing
  • JEP 380: Unix-Domain Socket Channels
  • JEP 386: Alpine Linux Port
  • JEP 387: Elastic Metaspace
  • JEP 388: Windows/AArch64 Port
  • JEP 389: Foreign Linker API (Incubator)
  • JEP 390: Warnings for Value-Based Classes
  • JEP 392: Packaging Tool
  • JEP 393: Foreign-Memory Access API (Third Incubator)
  • JEP 394: Pattern Matching for instanceof
  • JEP 395: Records
  • JEP 396: Strongly Encapsulate JDK Internals by Default
  • JEP 397: Sealed Classes (Second Preview)
阅读全文 »

管理系统配置参数。

用法

对系统的用户名和主机名进行修改

  • ComputerName 就是电脑名称,给人看的(在下图中,电脑名称)
  • HostName 主机名,但通常不会设置这个值
  • LocalHostName 主机名,和 Linux 系统的 hostname 一样(在下图中,本地网络中电脑名称)
阅读全文 »

绝大多数数据库,在执行 update 语句时,update t set a = b, b = a 便可实现 a、b 列值互换,赋值表达式右侧的值取的都是原始值。MySQL 则是例外,其单表更新是自左到右依次完成,即先完成 a = b,然后在完成 b = a (此时 a = b),所以执行结果变成 a、b 列都是 b,然后多表更新则又不尊从该更新法则。

这个问题源于业务中一次对券有效期进行延期的操作,需求是对优惠券有效期延期 35 天。

  • 一部分券在生效中,直接修改过期时间即可;
  • 一部分券已经过期,修改过期时间后,需要判断一下是否仍然是过期的还是生效中的,修改券的状态
阅读全文 »