Web 开发问题汇总(五)

1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ jmap -heap 29104
Attaching to process ID 29104, please wait...
ERROR: attach: task_for_pid(29104) failed: '(os/kern) failure' (5)
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges.
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges.
  at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$BsdDebuggerLocalWorkerThread.execute(BsdDebuggerLocal.java:169)
  at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.attach(BsdDebuggerLocal.java:287)
  at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671)
  at sun.jvm.hotspot.HotSpotAgent.setupDebuggerDarwin(HotSpotAgent.java:659)
  at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:341)
  at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
  at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
  at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
  at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
  at sun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:49)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at sun.tools.jmap.JMap.runTool(JMap.java:201)
  at sun.tools.jmap.JMap.main(JMap.java:130)
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges.
  at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.attach0(Native Method)
  at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.access$100(BsdDebuggerLocal.java:65)
  at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$1AttachTask.doit(BsdDebuggerLocal.java:278)
  at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$BsdDebuggerLocalWorkerThread.run(BsdDebuggerLocal.java:144)

A: macOS 上的 java 虚拟机基础工具不能附加到 java 进程上,操作系统环境为:

1
2
3
4
$ sw_vers
ProductName:  Mac OS X
ProductVersion:   10.15.7
BuildVersion: 19H1922

java 版本:

1
2
3
4
$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

google 了一番之后,问题可能是 macOS 上的 java 8 部分小版本有问题,于是我打算用虚拟机里面的 RockyLinux 来试下,结果是确定可以。

继续阅读

Redis 面试题

1.什么是 Redis?

Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine.

Redis是一个开源的内存数据结构存储,被用作数据库、缓存、消息代理和流媒体引擎。

2.Redis的内存占用量是多少?

我们看几个例子(都是使用64位实例得到的。

  • 一个空的实例使用~3MB的内存。
  • 100万个小键->字符串值对使用~85MB的内存。
  • 100万个键->哈希值,代表一个有5个字段的对象,使用~160 MB的内存。

3.为什么Redis将其整个数据集保存在内存中?

在过去,Redis的开发者尝试了虚拟内存和其他系统来允许大于RAM的数据集,但最终我们很高兴能做好一件事:数据从内存中提供,磁盘用于存储。所以现在还没有计划为Redis创建一个磁盘上的后端。Redis是当前设计的结果。

4.你能将Redis与基于磁盘的数据库一起使用吗?

可以,一个常见的设计模式是在Redis中保存频繁写的小数据(以及你需要Redis数据结构以有效方式为你的问题建模的数据),而大块的数据保存到 SQL或最终一致的磁盘数据库。同样,有时Redis被用来在内存中获取存储在磁盘数据库中的相同数据子集的另一个副本。这看起来类似于缓存,但实际上是一个更高级的模型,因为通常Redis数据集与磁盘数据库数据集一起更新,而不是在缓存错过时刷新。

5.如何减少Redis的整体内存用量?

如果可以的话,使用Redis的32位实例。同时善用小的哈希值、列表、排序集和整数集,因为Redis能够在少数元素的特殊情况下以更紧凑的方式表示这些数据类型。

6.如果Redis的内存用完了会怎样?

Redis有内置的保护措施,允许用户设置内存使用的最大限制,使用配置文件中的maxmemory选项,对Redis可以使用的内存进行限制。如果达到这个限制,Redis将开始对写命令回复错误(但会继续接受只读命令)。

你也可以配置Redis在达到最大内存限制时驱逐键值。

继续阅读

(翻译)Spring Boot 面试题

1. 概述

自推出以来,Spring Boot一直是Spring生态系统中的一个重要角色。这个项目凭借其自动配置能力使我们的生活变得更加轻松。

在本教程中,我们将介绍一些在求职面试中可能出现的与Spring Boot有关的最常见问题。

2. 题目

Q1. 什么是Spring Boot,其主要特点是什么?

Spring Boot本质上是一个建立在Spring框架之上的快速应用开发框架。凭借其自动配置和嵌入式应用服务器支持,再加上其享有的大量文档和社区支持,Spring Boot是迄今为止Java生态系统中最受欢迎的技术之一。

这里有几个突出的特点。

  • 启动器 – 一组依赖性描述符,可以一次性包括相关的依赖性
  • 自动配置 – 一种基于classpath上的依赖关系自动配置应用程序的方法
  • 执行器 – 获得生产就绪的功能,如监控
  • 安全性
  • 日志

译者点评:

官方文档总结的特点:

  • Create stand-alone Spring applications

  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)

  • Provide opinionated ‘starter’ dependencies to simplify your build configuration

  • Automatically configure Spring and 3rd party libraries whenever possible

  • Provide production-ready features such as metrics, health checks, and externalized configuration

  • Absolutely no code generation and no requirement for XML configuration


  • 创建独立的Spring应用程序

  • 直接嵌入Tomcat、Jetty或Undertow(不需要部署WAR文件)

  • 提供有主见的 “启动器 "依赖,以简化你的构建配置

  • 尽可能地自动配置Spring和第三方库

  • 提供生产就绪的功能,如度量、健康检查和外部化配置

  • 完全没有代码生成,也不需要XML配置

Q2. Spring和Spring Boot之间的区别是什么?

Spring框架提供了多种功能,使Web应用的开发更加容易。这些功能包括依赖性注入、数据绑定、面向切面编程、数据访问等等。

多年来,Spring越来越复杂,这种应用所需的配置量可能令人生畏。这就是Spring Boot的用武之地–它使配置一个Spring应用程序变得轻而易举。

从本质上讲,Spring是没有主见的,而Spring Boot对平台和库有主见,让我们快速上手。

下面是Spring Boot带来的两个最重要的好处。

  • 根据它在classpath上找到的库自动配置应用程序
  • 提供生产中的应用程序常见的非功能特性,如安全或健康检查

请查看我们的其他教程,了解普通Spring和Spring Boot的详细比较

继续阅读