央企太卷.....来自央企的7个面试题,一个一个生产难题

说在前面

在40岁老架构师尼恩的(50+)读者社群中,最近小伙伴,面试央企、美团、京东、阿里、 百度、头条等大厂。

下面是一个小伙伴成功拿到通过了一个央企设计研究院一面面试,现在把面试真题和参考答案收入咱们的宝典。

通过央企一面真题, 大家可以看看,收个优质央企Offer需要学点啥?

总之,光代码漂亮不够, 面试,还得会吹。

央企太卷.....来自央企的7个面试题,一个一个生产难题_第1张图片

这里把题目以及答案,经过整理和梳理之后,收入咱们的《尼恩Java面试宝典PDF》 V126版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发、吹牛水平。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】获取

文章目录

    • 说在前面
    • 某央企研究院面试真题
      • 1、项目中使用k8s,如何进行网络隔离的?
        • 1. 使用 Network Policies
        • 2. 使用 Calico 网络CNI 插件
        • 3. Java 代码实现
      • 2、基于springcloud-gateway设计的网关平台,api信息是如何保存的?使用或者改造了哪些内容?配置api基本信息能否使用nacos?
      • 3、你们jvm是如何监控的?监控方式有哪些?能说说对应的原理吗?
        • 监控方式
          • 1. JVM 参数监控
          • 2. JConsole & VisualVM
          • 3. 使用 Java 代码监控
          • 4. JVMTI
        • 监控原理
          • 1. JVM 参数监控
          • 2. JConsole & VisualVM
          • 3. JVMTI
          • 4. JMX
        • 总结
      • 4、如何保证开发过程中使用正确的 nacos 内容?场景:本地开发使用dev,不能链接test,prod, 保证生产环境安全
        • (1)服务端 nacos 隔离
        • (2)服务端 用户 隔离
        • (3)客户端 配置 隔离
      • 5、nginx+keepalive是如何设计的?还使用过哪些代理软件及硬件?
        • Nginx
        • Keepalive
        • Nginx + Keepalive
        • 代理软件及硬件
      • 6、加密算法了解吗?使用过哪些加密算法?应用的场景能简单说说吗?
        • 1. 对称加密算法:
        • 2. 非对称加密算法:
        • 3. 散列算法:
        • 非对称和对称完美结合
      • 7、如果应用频繁发生fullgc,cpu使用100%,如何处理?如何定位问题?解决办法有哪些?
        • 处理方式:
        • 定位问题:
        • 解决办法:
    • 附录:100道常备的算法题
    • 尼恩说在最后
    • 尼恩技术圣经系列PDF

某央企研究院面试真题

前天,小伙伴面试央企一个设计研究院, 遇到了几个核心难题, 找尼恩来求助。

央企太卷.....来自央企的7个面试题,一个一个生产难题_第2张图片

1、项目中使用k8s,如何进行网络隔离的?

在 Kubernetes(K8s)中,网络隔离可以通过使用不同的Network Policies 网络策略和适当的 CNI 插件来实现。

网络策略是 Kubernetes 的一个核心功能,它允许管理员控制 Pod 之间的网络通信。

使用 Network Policies 可以灵活地控制 Pod 之间的网络通信,而使用CNI 插件如Calico 可以提供额外的网络隔离功能。

同时,你可以使用 Kubernetes Java 客户端库来管理这些策略。

1. 使用 Network Policies

Kubernetes 支持使用 Network Policies 来控制 Pod 之间的网络通信。

Network Policies 允许你定义规则,以允许或拒绝特定命名空间中的 Pod 之间的通信。

例如,以下是一个简单的 Network Policy,它拒绝从命名空间 ns1 到命名空间 ns2 的所有网络通信:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: ns1
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

你还可以使用 podSelector 来选择特定的 Pod,并使用 ingressegress 规则来允许或拒绝这些 Pod 与其他 Pod 的通信。

2. 使用 Calico 网络CNI 插件

CNI(Container Network Interface)是一个标准,它定义了 Kubernetes 如何与网络插件交互。

Calico 是一个常见的 Kubernetes CNI 插件,它也提供了一种强大的方式来控制网络隔离。

Calico 支持使用 Calico 网络策略来定义网络规则。

例如,以下是一个简单的 Calico 网络策略,它允许从命名空间 ns1 到命名空间 ns2 的所有网络通信:

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: allow-all
  namespace: ns1
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

你还可以使用 podSelector 来选择特定的 Pod,并使用 ingressegress 规则来允许或拒绝这些 Pod 与其他 Pod 的通信。

3. Java 代码实现

在 Java 应用程序中,可以使用 Kubernetes Java 客户端库来创建和管理 Network Policies。

以下是一个简单的 Java 代码片段,它展示了如何使用 Kubernetes Java 客户端库来创建一个 Network Policy:

import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.Configuration;
import io.kubernetes.client.openapi.apis.NetworkingV1Api;
import io.kubernetes.client.openapi.models.V1NetworkPolicy;
import java.io.IOException;
public class NetworkPolicyExample {
    public static void main(String[] args) throws IOException, ApiException {
        ApiClient client = Configuration.getDefaultApiClient();
        NetworkingV1Api api = new NetworkingV1Api(client);
        V1NetworkPolicy policy = new V1NetworkPolicy();
        policy.setMetadata(null);
        policy.setSpec(null);
        // Set the desired network policy spec
        policy.getSpec().setPodSelector("");
        policy.getSpec().setPolicyTypes(Arrays.asList("Ingress", "Egress"));
        // Create the network policy
        api.createNamespacedNetworkPolicy("ns1", policy);
    }
}

这个代码片段创建了一个空的 Network Policy,你可以根据需要修改它。

2、基于springcloud-gateway设计的网关平台,api信息是如何保存的?使用或者改造了哪些内容?配置api基本信息能否使用nacos?

尼恩作为技术中台的负责人,曾经主导了 网关平台的架构和设计工作。

网关平台可以基于 成熟的网关如 kong、 springcloud-gateway 进行扩展,二次开发。

并且也进行过基于 kong、 springcloud-gateway 进行扩展,二次开发的预研, 并且基本实现了 代理 、转发的功能。

如果使用 springcloud-gateway进行 扩展, 是可以进行 路由规则的外部加载的, 可以从 redis、db 加载路由规则,设计和实现一个自己的 RouteDefinitionRepository 路由定义仓库 就OK了

从redis 加载路由规则的 参考代码如下

@Component
public class RedisRouteDefinitionRepository implements RouteDefinitionRepository {

    public static final String GATEWAY_ROUTES = "geteway_routes";

    @Resource
    private StringRedisTemplate redisTemplate;

    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        List<RouteDefinition> routeDefinitions = new ArrayList<>();
        redisTemplate.opsForHash().values(GATEWAY_ROUTES).stream()
            .forEach(routeDefinition -> routeDefinitions.add(JSON.parseObject(routeDefinition.toString(), RouteDefinition.class)));
        return Flux.fromIterable(routeDefinitions);
    }
}

springcloud-gateway 启动的时候,会进行 RouteDefinitionRepository 仓库的创建,如果自己义了,就使用 自定义的

如果没有自定义,就默认用InMemoryRouteDefinitionRepository,这缓存了从配置文件读取的路由规则。

而做动态路由的关键就在这里。

即通过自定义的RouteDefinitionRepository类,来提供路由配置信息。替代 默认的 InMemoryRouteDefinitionRepository ,就OK了。

所以,也比较简单。

springcloud gateway 的路由规则,可以从 外部数据源加载, 同样可以从nacos 加载。

同样,尼恩也基于kong,做过网关平台的预研, kong使用lua+nginx, lua语音比较简单,nginx性能高,也是实现网关平台的较好的选择。

但是,无论是kong、还是 springcloud-gateway , 开发的时候, 比较难以找到熟练的开发人员。

kong lua 开发人员本来少, 人难找, 大家也不愿意使用lua开发。

springcloud-gateway 使用 响应式编程, 这种编程模式和命令式相比,思维模式很不人性化, 执行流程跳跃性太强, 调试的时候,往往不知道下一步去了哪里, 生手更头疼。 这个人更难找、

或者说,就是尼恩会开发, 但也不可能一个人啥都干了。

所以,尼恩在做技术选型的时候,既没有使用 springcloud-gateway ,也没有使用kong,二是基于netty 去设计 api 网关平台。

性能高不说,人也好找。

如何使用 netty 去设计一个api 网关平台,具体请参见尼恩的第33章视频,这个是一个绝对的 面试黄金项目,简历黄金项目。

央企太卷.....来自央企的7个面试题,一个一个生产难题_第3张图片

3、你们jvm是如何监控的?监控方式有哪些?能说说对应的原理吗?

在 Java 中,JVM(Java Virtual Machine)的监控主要涉及对 JVM 内部状态和资源的使用情况进行监控和管理,以便在必要时对 JVM 进行优化和调整。

监控方式
1. JVM 参数监控

JVM 提供了一系列的参数,可以通过这些参数来控制和监控 JVM 的行为。例如,可以使用 -verbose:gc 参数来开启垃圾回收的详细输出,从而了解 GC 的频率、时间和回收的垃圾对象数量等信息。
另一个例子是,可以使用 -Xmx 参数来设置 JVM 最大允许的堆内存大小,从而限制堆内存的使用量。

2. JConsole & VisualVM

JConsole 和 VisualVM 是两个常用的图形化工具,用于监控和分析 JVM 的性能。它们可以显示 JVM 的各种指标,如 CPU 使用率、线程栈信息、死锁和垃圾回收等。

3. 使用 Java 代码监控

Java 代码可以通过一些 API 来获取 JVM 的信息。例如,可以使用 ManagementFactory 类来获取 JVM 的内存使用情况、线程栈信息等。
下面是一个简单的 Java 代码示例,展示了如何使用 ManagementFactory 类来获取 JVM 的内存使用情况:

import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.lang.management.ManagementFactory;
public class JVMMonitor {
    public static void main(String[] args) {
        MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
        MemoryUsage memoryUsage = memoryMXBean.getHeapMemoryUsage();
        System.out.println("Used Memory: " + memoryUsage.getUsed());
        System.out.println("Committed Memory: " + memoryUsage.getCommitted());
    }
}
4. JVMTI

JVMTI(Java Virtual Machine Tool Interface)是 JVM 提供的一套用于监控和控制 JVM 的接口。它允许开发人员创建自己的监控和分析工具,以定制的方式来监控 JVM。

监控原理
1. JVM 参数监控

JVM 参数监控的原理很简单,JVM 通过读取命令行参数或配置文件中的参数来改变其行为。

当 JVM 启动时,它会解析这些参数,并相应地调整其内部状态和资源使用。

2. JConsole & VisualVM

JConsole 和 VisualVM 的工作原理是利用 JVMTI 接口来获取 JVM 的各种信息。它们通过 JVMTI 接口向 JVM 发送请求,以获取所需的监控数据,并将其以可视化的方式呈现给用户。

3. JVMTI

JVMTI(Java 虚拟机工具接口、Java Virtual Machine Tool Interface,JVMT)是JVM提供了一种编程接口,

JVMTI 允许软件开发人员创建软件代理以监视和控制 Java 编程语言应用程序。

JVMTI 是 Java 2 Software Development Kit (SDK), Standard Edition, 版本 1.5.0 中的一种新增功能。

JVMTI 它取代了 Java Virtual Machine Profiling Interface (JVMPI),从版本 1.1 起即作为 Java 2 SDK 的一种实验功能包括在内。

在 JSR-163 中对 JVMTI 进行了有关说明。

JVMTI 的原理是,在 JVM 启动时,JVMTI 驱动程序会加载到 JVM 中,并创建一个 JVMTI 接口的实例。

开发人员可以使用 JVMTI 接口提供的方法来获取 JVM 的各种信息,如垃圾回收数据、线程栈信息等。

4. JMX

JMX 全称为 Java Management Extensions,翻译过来就是 Java 管理扩展,用来管理和监测 Java 程序。

最常用到的就是对于 JVM 的监测和管理,比如 JVM 内存、CPU 使用率、线程数、垃圾收集情况等等。

另外,还可以用作日志级别的动态修改,比如 log4j 就支持 JMX 方式动态修改线上服务的日志级别。

最主要的还是被用来做各种监控工具,常用的 Spring Boot Actuator、JConsole、VisualVM 等JVM监控工具,就是通过 JMX来实现。

Java 代码监控的原理是利用 ManagementFactory 类提供的 API 来获取 JVMTI 数据。ManagementFactory 类是 JVMTI 的一层包装,它将 JVMTI 的复杂性隐藏在简单的 Java 接口后面。

JMX 既是 Java 管理系统的一个标准,一个规范,也是一个接口,一个框架。有标准、有规范是为了让开发者可以定制开发自己的扩展功能,而且作为一个框架来讲,JDK 已经帮我们实现了常用的功能,尤其是对 JVM 的监控和管理。

grafana+prometheus+jmx

访问Grafana查看JVM面板,获得如下效果:

央企太卷.....来自央企的7个面试题,一个一个生产难题_第4张图片

总结

监控 JVM 的方法有很多,每种方法都有其优缺点。

开发人员应根据具体的应用场景和需求来选择合适的监控方法。在实际开发中,通常会结合多种方法来监控 JVM,以获取更全面和准确的 JVM 状态和性能信息。

4、如何保证开发过程中使用正确的 nacos 内容?场景:本地开发使用dev,不能链接test,prod, 保证生产环境安全

三种方法:

(1)服务端 nacos 隔离

(2)服务端 用户 隔离

(3)客户端 配置 隔离

(1)服务端 nacos 隔离

为dev, test,prod 启动 不同的 nacos 实例, 然后通过 环境变量 获取nacos 的 地址。

dev 环境, 配置的 是 dev 类型的nacos 实例

pod 类型的nacos 实例 的地址, 不对开发同学暴露。

这种做了最为 彻底的 保密工作。 保证生产环境安全

(2)服务端 用户 隔离

dev, test,prod 环境 共用nacos

为dev, test,prod 启动 不同的 nacos 用户, 然后通过 不同的用户, 获取不同环境的 配置。

dev 环境, 配置的 是 dev 类型的nacos 用户 去访问 nacos

test环境, 配置的 是 test类型的nacos 用户 去访问 nacos

prod 环境, 配置的 是 prod 类型的nacos 用户 去访问 nacos

(3)客户端 配置 隔离

客户端 可以采用以下方法:

  1. 配置环境变量
    为每个环境创建特定的环境变量,并确保在运行应用程序时使用正确的环境变量。例如,你可以为 devtestprod 环境创建名为 NACOS_SERVER_ADDRESS 的环境变量,分别指向各自的环境地址。
  2. 使用 Java System Properties
    你可以使用 Java 的 System.setProperty() 方法来为不同的环境设置不同的 Nacos 地址。这需要你在运行应用程序时传递相应的参数。
  3. 创建不同的配置文件
    为每个环境创建单独的配置文件,例如 application-dev.propertiesapplication-test.propertiesapplication-prod.properties。这些文件可以包含 Nacos 的地址和其他相关配置。在运行应用程序时,使用 spring.config.location 参数来指定相应的配置文件。
  4. 使用 Spring Profiles
    Spring Profiles 允许你为不同的环境创建不同的配置。你可以在 application.ymlapplication.properties 文件中使用 spring.profiles.active 属性来选择要激活的配置。
    下面是使用 Java System Properties 的示例代码:
import java.util.Properties;
public class NacosConfig {
    public static void main(String[] args) {
        // 根据环境设置 Nacos 地址
        String nacosAddress;
        if (System.getProperty("env") == null || System.getProperty("env").equals("dev")) {
            nacosAddress = "localhost:8848";
        } else if (System.getProperty("env").equals("test")) {
            nacosAddress = "test-nacos-server:8848";
        } else if (System.getProperty("env").equals("prod")) {
            nacosAddress = "prod-nacos-server:8848";
        } else {
            throw new RuntimeException("Invalid environment");
        }
        // 使用 NacosAddress
        System.out.println("Nacos server address: " + nacosAddress);
    }
}

在运行应用程序时,你可以使用 -Denv=dev-Denv=test-Denv=prod 参数来选择要使用的环境。

上述方法可以确保你在本地开发环境中使用正确的 Nacos 内容,而不会影响到其他环境。当然,具体实现可能会根据你的项目结构和使用的工具而有所不同。

5、nginx+keepalive是如何设计的?还使用过哪些代理软件及硬件?

NginxKeepalive 是两个不同的软件,但它们可以一起使用,以提供高可用性、负载均衡和缓存等优势。下面,我将分别简要介绍这两个软件,然后探讨它们是如何一起设计的。

Nginx

什么是 Nginx?

Nginx 是一个高性能的 HTTP 和反向代理服务器。它用于 HTTP 服务器、反向代理、负载均衡和 HTTP 缓存。

Nginx 的优势

  • 高性能:相对于 Apache,Nginx 能处理更多的并发连接。
  • 轻量级:相对于 Apache,Nginx 更轻量,资源占用更少。
  • 模块化:Nginx 的模块化架构使其易于扩展和定制。
  • 安全性:Nginx 注重安全性,提供诸如 SSL/TLS 加密、防止 SQL 注入等安全功能。
Keepalive

什么是 Keepalive?
Keepalive 是一个支持集群的高可用性解决方案,主要用于数据库、队列服务和消息服务。

Keepalive 的优势

  • 高可用性:Keepalive 确保即使一个或多个服务器出现故障,服务仍然可以继续运行。
  • 负载均衡:Keepalive 可以通过多个服务器之间的负载均衡来提高性能。
  • 简化管理:Keepalive 简化了复杂的服务器集群管理。
Nginx + Keepalive

设计目的
NginxKeepalive 的结合旨在提供高可用性、高性能的 Web 应用程序。Nginx 用于处理 HTTP 请求,而 Keepalive 用于确保服务器的可靠性。

工作原理

  • 当客户端发起一个 HTTP 请求时,该请求首先到达 Nginx
  • Nginx 接收请求,并根据负载均衡策略,将请求分发给后端服务器。
  • 后端服务器处理请求,并将响应返回给 Nginx
  • Nginx 接收响应,并将其返回给客户端。
  • 如果某个后端服务器出现故障,Keepalive 会自动将其从服务列表中移除,并尝试重启它。
代理软件及硬件

在网络安全和性能优化领域,除了 Nginx 之外,还有许多其他代理软件和硬件设备。以下是一些常见的代理软件和硬件:

  1. Apache:Apache 是一款高性能的 HTTP 服务器,与 Nginx 类似,它也可以用作反向代理、负载均衡和 HTTP 缓存。Apache 支持多种模块,可以满足各种需求。
  2. Caddy:Caddy 是一个现代的、开源的 HTTP 服务器,专为安全和性能而设计。它支持 SSL/TLS 证书管理、反向代理、缓存等功能。
  3. Varnish:Varnish 是一个高性能的 HTTP 缓存服务器,可用于提高网站性能。它与 Nginx 类似,支持 HTTP/2 和 SSL/TLS。
  4. squid:squid 是一个开源的 HTTP 缓存服务器,可用于提高网站性能。它支持 HTTP/1.1 和 HTTP/2,以及 SSL/TLS。
  5. WebAccelerator:WebAccelerator 是一款专为提高 Web 应用程序性能而设计的硬件设备。它支持 HTTP 缓存、压缩、负载均衡等功能。
  6. F5 Networks:F5 Networks 是一家知名的网络设备制造商,其产品包括硬件负载均衡器、SSL/TLS 加密设备等。F5 的产品广泛应用于企业网络、数据中心等场景。
  7. Citrix:Citrix 是一家提供虚拟化和云计算解决方案的公司,其产品包括硬件代理、负载均衡器和 SSL/TLS 设备。Citrix 的产品适用于企业级用户,可提高应用程序性能和安全性。
  8. A10 Networks:A10 Networks 是一家提供网络解决方案的公司,其产品包括硬件负载均衡器、SSL/TLS 加密设备和防火墙等。A10 的产品适用于各种规模的企业和数据中心。
  9. Radware:Radware 是一家提供网络安全和应用交付解决方案的公司,其产品包括硬件代理、负载均衡器和防御设备。Radware 的产品适用于保护企业网络免受攻击,提高应用程序性能。
  10. Arbor Networks:Arbor Networks 是一家提供网络安全和流量管理解决方案的公司,其产品包括硬件代理、负载均衡器和防御设备。Arbor 的产品适用于大型企业和数据中心,可确保网络安全和高效运行。

这些代理软件和硬件设备根据其特点和功能,在不同的场景中发挥作用。在实际应用中,可以根据需求和预算选择合适的代理软件或硬件设备。同时,为了确保数据安全和高可用性,还可以将这些代理与其他安全措施(如身份验证、访问控制等)结合使用。

6、加密算法了解吗?使用过哪些加密算法?应用的场景能简单说说吗?

在计算机科学中,加密算法是用于将数据转换为一种秘密形式的数学函数。它使得只有授权方能够访问原始数据,从而保护数据的机密性和安全性。

常见的加密算法包括:

1. 对称加密算法:
  • AES:AES 适用于各种场景,如加密敏感数据、保护网络通信、加密存储等。例如,在电子支付、数据传输和数据库安全方面,AES 可以确保数据在传输过程中的安全性。AES 支持 128 位、192 位和 256 位密钥长度,密钥长度越长,安全性越高。
  • DES:DES 主要用于加密敏感数据,例如在金融和保险领域。但由于其安全性较低(已被破解),现在已经逐渐被 AES 取代。DES 支持 56 位密钥长度。
  • 3DES:3DES 适用于需要高安全性的场景,例如加密网络通信、安全认证等。但由于其性能较差,在许多场景下已被 AES 取代。3DES 是对 DES 的改进,采用 112 位或 168 位密钥长度。
2. 非对称加密算法:
  • RSA:RSA 广泛应用于公钥基础设施(PKI)领域,如数字签名、加密电子邮件、安全认证等。RSA 适用于加密对称加密密钥,以防止密钥泄露。RSA 支持不同长度的密钥,但通常使用 1024 位或 2048 位以保证安全性。
  • DSA:DSA 主要用于数字签名,适用于安全认证、电子商务等场景。与 RSA 相比,DSA 在相同的安全级别下具有较小的密钥长度,但性能较差。DSA 支持 1024 位密钥长度。
  • ECC:ECC 适用于高安全性场景,如加密数字货币、安全认证等。与 RSA 相比,ECC 提供了相同的安全性,但具有更好的性能和较短的密钥长度。ECC 使用的密钥长度取决于所选曲线,通常为 256 位或 512 位。
3. 散列算法:
  • SHA-1:SHA-1 适用于数字签名、文件完整性验证等场景。但由于哈希碰撞问题,SHA-1 已被认为是不安全的。在实际应用中,建议使用 SHA-256 或其他更安全的散列算法。
  • SHA-256:SHA-256 是 SHA-1 的一个变种,提供更高的安全性。它被用于数字签名、文件完整性验证等场景。SHA-256 具有 256 位的散列值,相较于 SHA-1,其安全性更高。
  • HMAC:HMAC 用于提供消息的完整性和身份验证。它适用于保护 Web 应用程序、网络设备等。HMAC 可以与多种散列函数(如 SHA-256)结合使用,以实现更高的安全性。

这些加密算法根据其特点和安全性在不同的场景中发挥作用。在实际应用中,通常会根据需求和安全性要求选择合适的加密算法。同时,为了确保数据安全,还需要结合其他安全措施,如身份验证、访问控制等。

非对称和对称完美结合

非对称加密既然也有缺陷,那我们就将对称加密,非对称加密两者结合起来,取其精华、去其糟粕,发挥两者的各自的优势:

央企太卷.....来自央企的7个面试题,一个一个生产难题_第5张图片

这是个非常非常经典的数据传输过程,也是Https传输协议里面最经典的部分。也是把对称加密和非对称加密的作用发挥到了很好的地方。

在https传输的过程中,如果单独只用对称加密,或者单独使用非对称加密都会出现问题。

关于加密算法的实操,具体请参见尼恩的 《Java高并发核心编程 卷1 加强版》

7、如果应用频繁发生fullgc,cpu使用100%,如何处理?如何定位问题?解决办法有哪些?

处理方式:
  1. 临时处理
  • 首先,尝试通过JVM参数来调整垃圾回收策略和优化垃圾回收器的行为。例如,可以尝试增加堆内存大小,调整年轻代和老年代的比例,或者尝试其他垃圾回收器(如G1、Parallel等)。
  • 增加JVM的堆内存大小。使用-Xms-Xmx参数设置堆内存的大小。
  • 调整年轻代和老年代的大小。使用-XX:NewRatio-XX:SurvivorRatio参数。
  • 尝试使用其他垃圾回收器。使用-XX:+UseG1GC-XX:+UseParallelGC参数。
  1. 长久处理
  • 优化代码。这包括:

    • 减少不必要的对象创建。
    • 重用对象而不是每次都创建新的对象。
    • 使用对象池来重用对象。
    • 避免使用全局变量和静态变量。
    • 使用弱引用、软引用和幻象引用。
  • 监控和分析内存使用情况。使用Java内置的工具(如jconsolejvisualvm等)或第三方工具(如YourKit、MAT等)来分析内存使用情况。

  • 考虑使用分布式缓存系统(如Redis、Memcached等)来减轻应用服务器的负担。

定位问题:
  1. 查看日志
  • 查看Java虚拟机(JVM)的日志,看是否有关于垃圾回收的错误或警告信息。
  • 查看应用服务器的日志,看是否有关于响应时间、错误率等与性能相关的信息。
  1. 分析内存
  • 使用内存分析工具(如MAT)来检查内存使用情况。查看哪些对象占据了大量的内存,以及是否存在内存泄漏。
  1. 分析线程
  • 检查是否有死锁或其他线程相关的问题。使用线程分析工具(如VisualVM、YourKit等)来检查线程栈和线程状态。
  1. 分析CPU
  • 使用CPU分析工具(如VisualVM、YourKit等)来检查CPU的使用情况。查看哪些线程或方法占据了大量的CPU时间。
解决办法:
  1. 代码优化
  • 优化代码以减少不必要的对象创建和长时间的对象引用。
  • 使用对象池来重用对象。
  • 减少全局变量和静态变量的使用。
  • 使用弱引用、软引用和幻象引用。
  1. 调整JVM参数
  • 增加堆内存大小。
  • 调整年轻代和老年代的大小。
  • 尝试使用其他垃圾回收器。
  1. 使用分布式缓存
  • 考虑使用分布式缓存系统(如Redis、Memcached等)来减轻应用服务器的负担。
  1. 监控和分析
  • 通过promethus监控内存、CPU和线程的使用情况。使用Java内置的工具或第三方工具来分析服务器性能。

附录:100道常备的算法题

大厂一般都重视算法。

尼恩给大家备好了100道常背的算法题, 大家要一定要吃透,温故而知新, 常常看看, 不要忘了。

央企太卷.....来自央企的7个面试题,一个一个生产难题_第6张图片

尼恩说在最后

在尼恩的(50+)读者社群中,很多、很多小伙伴需要进大厂、拿高薪。

尼恩团队,会持续结合一些大厂的面试真题,给大家梳理一下学习路径,看看大家需要学点啥?

前面用多篇文章,给大家介绍阿里、百度、字节、滴滴的真题:

《赢麻了……腾讯1面核心9问,小伙伴过了提42W offer》

《太细了:美团一面连环夺命20问,搞定就60W起》

《炸裂,靠“吹牛”过京东一面,月薪40k》

《太猛了,靠“吹牛”过顺丰一面,月薪30K》

《问懵了…美团一面索命44问,过了就60W+》

《炸裂了…京东一面索命40问,过了就50W+》

《问麻了…阿里一面索命27问,过了就60W+》

《百度狂问3小时,大厂offer到手,小伙真狠!》

《饿了么太狠:面个高级Java,抖这多硬活、狠活》

《字节狂问一小时,小伙offer到手,太狠了!》

《收个滴滴Offer:从小伙三面经历,看看需要学点啥?》

这些真题,都会收入到 史上最全、持续升级的 PDF电子书 《尼恩Java面试宝典》。

本文收录于 《尼恩Java面试宝典》。

基本上,把尼恩的 《尼恩Java面试宝典》吃透,大厂offer很容易拿到滴。另外,下一期的 大厂面经大家有啥需求,可以发消息给尼恩。

尼恩技术圣经系列PDF

  • 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
  • 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
  • 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
  • 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
  • 《大数据HBase学习圣经:一本书实现HBase学习自由》
  • 《大数据Flink学习圣经:一本书实现大数据Flink自由》
  • 《响应式圣经:10W字,实现Spring响应式编程自由》
  • 《Go学习圣经:Go语言实现高并发CRUD业务开发》

……完整版尼恩技术圣经PDF集群,请找尼恩领取

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

你可能感兴趣的:(面试,面试,java,架构,数据库,后端,算法)