永红的互联网手记

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

0%

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 天。

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

在短短的两个月里,已经遇到了 2 次这个问题,第 1 次是 macOS@Catalina 版本,第 2 次是升级后的 macOS@Big Sur 版本,在这里记录一下解决办法。

macOS@Catalina 版本

重启系统进入恢复模式,关闭 SIP,重启后命令行执行下面这行代码,再创建文件夹就能成功了。

1
sudo mount -uw /

macOS@Big Sur 版本

重启系统进入恢复模式,关闭 SIP(不确定有没有这个步骤,如果有人尝试可以评论一下),接下来稍稍麻烦一点,修改 /etc/synthetic.conf 文件

阅读全文 »

在 Java Virtual Machine Specification 中,有对 JVM 指令集的详细描述,可以打开链接查看:

  • Java 11:https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-6.html
  • Java 8:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html

也有人整理了一个对照表,记录在下面

阅读全文 »

Mercurial是跨平台的分布式版本控制软件,主要由Python语言实现,但也包含用C语言实现的二进制比较工具。Mercurial一开始的主要运行平台是Linux,现在Mercurial已经移植到Windows、Mac OS X和大多数的类Unix系统中。Mercurial主要由命令行程序组成,现在也有了图形用户界面。对Mercurial的所有操作都由用不同的关键字作为参数调用程序“hg”来实现,Hg是参考水银的化学符号而取的名字。

Mercurial的主要设计目标包括高性能、可扩展性、分散性、完全分布式合作开发、能同时高效地处理纯文本和二进制文件,以及分支和合并功能,以此同时保持系统的简洁性[1]。Mercurial也包括一个集成的Web界面。

Mercurial的创建者和主要开发人员是Matt Mackal。其源代码采用GNU通用公共许可证第二版为授权,确保了Mercurial是一个自由软件。

阅读全文 »