JVM 性能调优 - 常用的垃圾回收器(6)
垃圾收集器
在 JVM(Java虚拟机)中,垃圾收集器(Garbage Collector)是负责自动管理内存的组件。它的主要任务是在程序运行过程中,自动回收不再使用的对象所占用的内存空间,以便为新的对象提供足够的内存。
JVM中的垃圾收集器使用不同的算法和策略来实现垃圾收集过程,以满足不同的性能和内存需求。以下是 JVM 中常见的垃圾收集器:
-
Serial收集器:是最古老的垃圾收集器,使用单线程进行垃圾收集。它适用于小型应用程序或者客户端应用程序,具有简单、高效的特点。
-
Parallel收集器:也称为吞吐量优先收集器,使用多线程进行垃圾收集。它适用于需要高吞吐量的应用程序,可以充分利用多核处理器的优势。
-
CMS(Concurrent Mark Sweep)收集器:是一种并发收集器,它在垃圾收集过程中,尽可能减少应用程序的停顿时间。它适用于对响应时间有较高要求的应用程序。
-
G1(Garbage-First)收集器:是一种面向服务器应用程序的垃圾收集器,它通过将堆内存划分为多个区域,并根据垃圾分布情况进行优化的方式,实现高效的垃圾收集。
除了以上列举的垃圾收集器,JVM还提供了其他一些垃圾收集器,如ZGC(Z Garbage Collector)和Shenandoah等,它们都具有不同的特点和适用场景。
然而,Java虚拟机规范(Java Virtual Machine Specification)并没有具体规定垃圾收集器的实现细节,它只定义了Java虚拟机的内存模型和垃圾收集的基本概念。具体的垃圾收集器的实现是由不同的JVM厂商根据规范进行开发和优化的。
Java虚拟机规范确实提供了一些关于垃圾收集器的建议和要求,例如:
-
垃圾收集器应该能够自动识别和回收不再使用的对象,以避免内存泄漏和内存溢出的问题。
-
垃圾收集器应该能够根据需要动态调整内存的分配和回收策略,以提高性能和效率。
-
垃圾收集器应该能够最小化应用程序的停顿时间,以提供更好的响应性能。
-
垃圾收集器应该能够处理不同类型的对象,包括普通对象、数组对象和本地对象等。
总之,虽然Java虚拟机规范没有具体规定垃圾收集器的实现细节,但它提供了一些关于垃圾收集器的建议和要求,以确保Java虚拟机能够提供高效、可靠的垃圾收集机制。具体的垃圾收集器的实现取决于不同的JVM厂商和版本。
七大经典垃圾收集器
- 串行回收器:Serial、Serial Old。
- 并行回收器:ParNew、Parallel Scavenge、Parallel Old。
- 并发回收器:CMS、G1。
我们可以从下图中看到各大垃圾收集器的应用程序线程和垃圾回收线程的关系。
垃圾收集器和垃圾分代关系
-
新生代收集器:Serial GC、ParNew GC、Parallel Scavenge GC。
-
老年代收集器:CMS GC、Serial old、Parallel Old GC。
-
整堆收集器:G1。
垃圾收集器和垃圾分代关系如下图所示:
垃圾回收算法
- 引用计数(Java 中不使用)
- 复制拷贝(新生代用)
- 标记清除(用于老年代)
- 标记整理(用于老年代)
垃圾收集器分类
按线程数分
可以分为串行回收和并行回收。
- 串行回收器:同一时间段内只有一个
CPU
用于执行垃圾回收,应用程序线程将被暂停,直至收集。 - 并行回收器:垃圾回收器的线程与应用程序线程可以交替运行,尽可能减少垃圾回收停顿的时间。
- 串行和并行回收器的共同点:都会发生
Stop the world
。 - 串行回收器应用场景:客户端的
Client
模式下的 JVM 中。
按工作模式分
可以分为串行并发式回收和独占式回收。
- 并发式垃圾收集器:回收线程和应用程序线程交替工作,减少应用程序的停顿时间。
- 独占式垃圾收集器:只要进行垃圾回收,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束。
按碎片处理方式分
可以分为压缩式回收和非压缩式回收。
- 压缩式回收:在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。
- 非压缩式回收:不进行压缩处理。
垃圾收集器的性能
- 吞吐量:CPU 运行用户代码的时间和 CPU 总消耗时间的比值。
- 暂停时间:应用程序线程暂停,GC 线程执行。
其实没有一个完美的垃圾收集器,也没有万能的垃圾收集器。每个收集器都有最合适场景,按需结合使用才能发挥最大的功效。
垃圾收集器总结
编写代码
package com.test;public class TestJavaHeapSpace {public static void main(String[] args) {byte[] bytes1 = new byte[1 * 1024 * 1024];byte[] bytes2 = new byte[1 * 1024 * 1024];byte[] bytes3 = new byte[1 * 1024 * 1024];}
}
运行程序
$ java -Xms2M -Xmx2M -XX:+PrintCommandLineFlags -XX:+PrintGCDetails com.test.TestJavaHeapSpace
[GC (Allocation Failure) [PSYoungGen: 511K->488K(1024K)] 511K->504K(1536K), 0.0319948 secs] [Times: user=0.00 sys=0.00, real=0.04 secs]
[GC (Allocation Failure) [PSYoungGen: 985K->504K(1024K)] 1001K->642K(1536K), 0.0007380 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 1009K->509K(1024K)] 1148K->736K(1536K), 0.0007602 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 1013K->509K(1024K)] 1240K->760K(1536K), 0.0005670 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 1014K->509K(1024K)] 1265K->776K(1536K), 0.0006131 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 1018K->509K(1024K)] 1285K->808K(1536K), 0.0005305 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) --[PSYoungGen: 1008K->1008K(1024K)] 1307K->1515K(1536K), 0.0336632 secs] [Times: user=0.00 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 1008K->266K(1024K)] [ParOldGen: 506K->421K(512K)] 1515K->688K(1536K), [Metaspace: 2525K->2525K(1056768K)], 0.0057810 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (Ergonomics) [PSYoungGen: 764K->196K(1024K)] [ParOldGen: 421K->389K(512K)] 1186K->586K(1536K), [Metaspace: 2526K->2526K(1056768K)], 0.0048920 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (Ergonomics) [PSYoungGen: 698K->196K(1024K)] [ParOldGen: 389K->391K(512K)] 1088K->588K(1536K), [Metaspace: 2526K->2526K(1056768K)], 0.0051047 secs] [Times: user=0.05 sys=0.00, real=0.00 secs]
[Full GC (Ergonomics) [PSYoungGen: 692K->196K(1024K)] [ParOldGen: 391K->392K(512K)] 1084K->589K(1536K), [Metaspace: 2526K->2526K(1056768K)], 0.0053302 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (Ergonomics) [PSYoungGen: 702K->196K(1024K)] [ParOldGen: 392K->394K(512K)] 1094K->591K(1536K), [Metaspace: 2526K->2526K(1056768K)], 0.0050899 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (Ergonomics) [PSYoungGen: 707K->196K(1024K)] [ParOldGen: 394K->395K(512K)] 1101K->592K(1536K), [Metaspace: 2526K->2526K(1056768K)], 0.0049420 secs] [Times: user=0.06 sys=0.00, real=0.00 secs]
[Full GC (Ergonomics) [PSYoungGen: 707K->196K(1024K)] [ParOldGen: 395K->396K(512K)] 1103K->593K(1536
相关文章:
JVM 性能调优 - 常用的垃圾回收器(6)
垃圾收集器 在 JVM(Java虚拟机)中,垃圾收集器(Garbage Collector)是负责自动管理内存的组件。它的主要任务是在程序运行过程中,自动回收不再使用的对象所占用的内存空间,以便为新的对象提供足够的内存。 JVM中的垃圾收集器使用不同的算法和策略来实现垃圾收集过程,以…...
【java】Hibernate访问数据库
一、Hibernate访问数据库案例 Hibernate 是一个在 Java 社区广泛使用的对象关系映射(ORM)工具。它简化了 Java 应用程序中数据库操作的复杂性,并提供了一个框架,用于将对象模型数据映射到传统的关系型数据库。下面是一个简单的使…...
从零开始手写mmo游戏从框架到爆炸(八)— byte数组传输
导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 Netty帧解码器 Netty中,提供了几个重要的可以直接使用的帧解码器。 LineBasedFrameDecoder 行分割帧解码器。适用场景:每个上层数据包,使…...
Elasticsearch:BM25 及 使用 Elasticsearch 和 LangChain 的自查询检索器
本工作簿演示了 Elasticsearch 的自查询检索器将非结构化查询转换为结构化查询的示例,我们将其用于 BM25 示例。 在这个例子中: 我们将摄取 LangChain 之外的电影样本数据集自定义 ElasticsearchStore 中的检索策略以仅使用 BM25使用自查询检索将问题转…...
uniapp的api用法大全
页面生命周期API uniApp中的页面生命周期API可以帮助开发者在页面的不同生命周期中执行相应的操作。常用的页面生命周期API包括:onLoad、onShow、onReady、onHide、onUnload等。其中,onLoad在页面加载时触发,onShow在页面显示时触发…...
笔记——asp.net core 中的 REST
REST(reprentational state transfer,表层状态转移) REST原则:提倡按照HTTP的语义使用HTTP。 如果一个系统符合REST原则,我们就说这个系统是Restful风格的。 在RPC风格的Web API系统中,我们把服务端的代码…...
排序算法---堆排序
原创不易,转载请注明出处。欢迎点赞收藏~ 堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法。它将待排序的元素构建成一个最大堆(或最小堆),然后逐步将堆顶元素与堆的最后一个元素交换位置,…...
Java字符串(包含字母和数字)通用排序
说明:本文章是之前查到的一篇安卓版的,具体原文路径忘记了。稍微改了一点,挺符合业务使用的! 一、看代码 /*** 包含数字的字符串进行比较(按照从小到大排序)*/private static Integer compareString(Stri…...
【Spring】springmvc如何处理接受http请求
目录 编辑 1. 背景 2. web项目和非web项目 3. 环境准备 4. 分析链路 5. 总结 1. 背景 今天开了一篇文章“SpringMVC是如何将不同的Request路由到不同Controller中的?”;看完之后突然想到,在请求走到mvc 之前服务是怎么知道有请求进来…...
2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题
题库来源:安全生产模拟考试一点通公众号小程序 2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题是由安全生产模拟考试一点通提供,安全员-B证证模拟考试题库是根据安全员-B证最新版教材,安全员-B证大纲整理而成(含2024年…...
redis过期淘汰策略、数据过期策略与持久化方式
redis的过期淘汰策略 redis过期淘汰策略有很多,默认是no-eviction 不删除任何数据,内存不足存入会直接报错,可以在redis配置文件中进行设置,其中有两个非常重要的概念,LRU与LFU LRU表示最近最少使用,LFU为最少频率使用 又按照volatile已设置过期时间的数据集和allkeys所有数…...
Oracle Vagrant Box 扩展根文件系统
需求 默认的Oracle Database 19c Vagrant Box的磁盘为34GB。 最近在做数据库升级实验,加之导入AWR dump数据,导致空间不够。 因此需要对磁盘进行扩容。 扩容方法1:预先扩容 此方法参考文档Vagrant, how to specify the disk size?。 指…...
TDengine用户权限管理
Background 官方文档关于用户管理没有很详细的介绍,只有零碎的几条,这里记录下方便后面使用。官方文档:https://docs.taosdata.com/taos-sql/show/#show-users 1、查看用户 show users;super 1,表示超级用户权限 0,表…...
推荐一款开源的跨平台划词翻译和OCR翻译软件:Pot
Pot简介 一款开源的跨平台划词翻译和OCR翻译软件 下载安装指南 根据你的机器型号下载对应版本,下载完成后双击安装即可。 使用教程 Pot具体功能如下: 划词翻译输入翻译外部调用鼠标选中需要翻译的文本,按下设置的划词翻译快捷键即可按下输…...
spring boot学习第十一篇:发邮件
1、pom.xml文件内容如下(是我所有学习内容需要的,不再单独分出来,包不会冲突): <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…...
Linux中ps/kill/execl的使用
ps命令: ps -aus或者ps -ajx或者 ps -ef可以查看有哪些进程。加上 | grep "xxx" 可以查看名为”xxx"的进程。 ps -aus | grep "xxx" kill命令: kill -9 pid 杀死某个进程 kill -l 查看系统有哪些信号 execl函数&#…...
【web前端开发】HTML及CSS简单页面布局练习
案例一 网页课程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…...
2.7日学习打卡----初学RabbitMQ(二)
2.7日学习打卡 JMS 由于MQ产品很多,操作方式各有不同,于是JAVA提供了一套规则 ——JMS,用于操作消息中间件。JMS即Java消息服务 (JavaMessage Service)应用程序接口,是一个Java平台中关于面 向消息中间件的…...
【工作学习 day04】 9. uniapp 页面和组件的生命周期
问题描述 uniapp常用的有:页面和组件,并且页面和组件各自有各自的生命周期函数,那么在页面/组件请求数据时,是用created呢,还是用onLoad呢? 先说结论: 组件使用组件的生命周期,页面使用页面的…...
Mysql-数据库优化-客户端连接参数
客户端参数 原文地址 # 连接池配置 # 初始化连接数 spring.datasource.druid.initial-size1 # 最小空闲连接数,一般设置和initial-size一致 spring.datasource.druid.min-idle1 # 最大活动连接数,一个数据库能够支撑最大的连接数是多少呢? …...
【十二】【C++】vector用法的探究
vector类创建对象 /*vector类创建对象*/ #if 1 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std; #include <vector> #include <algorithm> #include <crtdbg.h>class Date {public:Date(int year 1900, int month 1, int …...
Docker 基本介绍
Docker 基本介绍 镜像 Docker镜像就是一个只读的模板。 例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Apache或用户需要的其它应用 程序。 镜像可以用来创建Docker容器。Docker提供了一个很简单的机制来创建镜像或者更新现有的镜…...
CentOS 7 安装 install abiword
安装 1.下载noarch安装包 wget http://repo.iotti.biz/CentOS/7/noarch/lux-release-7-1.noarch.rpm 2.安装noarch rpm -Uvh lux-release-7-1.noarch.rpm 3.安装abiword yum -y install abiword...
开源的直播平台
直播平台系统界面介绍 开源一套直播平台 私信可获取源码...
ChatGPT 变懒最新解释!或和系统Prompt太长有关
大家好我是二狗。 ChatGPT变懒这件事又有了最新解释了。 这两天,推特用户Dylan Patel发文表示: 你想知道为什么 ChatGPT 和 6 个月前相比会如此糟糕吗? 那是因为ChatGPT系统Prompt是竟然包含1700 tokens,看看这个prompt里面有多…...
书生·浦语大模型第三课作业
基础作业: 复现课程知识库助手搭建过程 (截图) 进阶作业: 选择一个垂直领域,收集该领域的专业资料构建专业知识库,并搭建专业问答助手,并在 OpenXLab 上成功部署(截图,并提供应用地址&#x…...
【Redis笔记】分布式锁及4种常见实现方法
线程锁 主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Synchronized、Lock等。 进程锁 控制同…...
SpringMVC第一天
一、SpringMVC简介 1 SpringMVC概述 1.1 SpringMVC概述 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 优点 使用简单,开发便捷(相比于Servlet) 灵活性强 2 入门案例【重点】 问题导入 在Controller中如何定义访问路径ÿ…...
如何利用腾讯工蜂提升广告推广和用户运营效率
无代码开发:腾讯工蜂的连接优势 在广告推广和用户运营中,腾讯工蜂的无代码开发优势让广告系统和用户运营系统能够轻松地实现无需API开发的集成。这使得没有专业编程技能的工作人员也能通过腾讯工蜂的用户友好界面,实现系统的快速连接和集成&…...
【QT+QGIS跨平台编译】之三十二:【MiniZip+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
文章目录 一、MiniZip介绍二、文件下载三、文件分析四、pro文件五、编译实践一、MiniZip介绍 MiniZip是一个轻量级的开源库,用于创建、读取和操作ZIP文件格式的压缩文件。它提供了一组简单而灵活的API,可以方便地在应用程序中进行ZIP文件的压缩和解压操作。 MiniZip的主要特…...
OLAP技术的发展及趋势简述
这里写自定义目录标题 历史发展基于电子表格的数据分析基于传统数据库的数据分析基于大数据的数据分析 当下的现状OLAP技术的分类MOLAPROLAPHOLAP 主流的OLAP引擎新技术的普及内存向量计算列式数据存储及交换增量查询多源融合计算下推物化视图 发展趋势智能化分析多源融合和自动…...
stupid_brain
前言: 本文用于记录本人AI新手期间犯的各种错误,时常更新。 正文开始: 读取数据的num_worker设置过少,以至于训练速度卡在读取数据上。训练集数据处理:数据增强有利于解决过拟合问题。模型:relu少写、batc…...
C# BackgroundWorker的使用
C# 中的 BackgroundWorker 类是 .NET Framework 提供的一个组件,用于在后台线程上异步执行长时间运行的操作,同时保持与用户界面(UI)的交互,如更新进度信息或处理取消请求。这使得可以轻松地在不冻结UI的情况下执行耗时…...
(简单有案例)前端实现主题切换、动态换肤的两种简单方式
目录 背景 (强烈推荐)实现方法1:CSS中原生变量“--”和var() 步骤1:定义css变量 步骤2:使用CSS变量 步骤3:切换主题 实现完整案例 实现方法2:link 动态引入 背景 我们需要做一个功能&#…...
wyh的迷宫
涉及知识点:求迷宫能否到达终点的,而不是求路径数的,用bfs时可以不用重置状态数组(回溯)。 题目描述 给你一个n*m的迷宫,这个迷宫中有以下几个标识: s代表起点 t代表终点 x代表障碍物 .代…...
AWS云用户创建
问题 需要给工友创建AWS云的用户,这里假设使用分配给自己AWS开发者IAM账号,给别人创建aws IAM账号。 登录系统 打开页面:https://xxx.signin.aws.amazon.com/console,使用分配的开发者账号登录。如下图: 创建用户…...
微信小程序(三十七)选项点击高亮效果
注释很详细,直接上代码 上一篇 新增内容: 1.选择性渲染类 2.以数字为需渲染内容(数量) 源码: index.wxml <view class"Area"><!-- {{activeNumindex?Active:}}是选择性添加类名进行渲染 -->&l…...
通过Demo学WPF—数据绑定(二)
准备 今天学习的Demo是Data Binding中的Linq: 创建一个空白解决方案,然后添加现有项目,选择Linq,解决方案如下所示: 查看这个Demo的效果: 开始学习这个Demo xaml部分 查看MainWindow.xaml: …...
数据湖的整体思路
湖本质上是一个集中化,中心化的,一体化的存储技术,并且在其之上追求技术架构的统一化,如流批一体,服务分析一体化。 当数据湖成为中心,那么就可以围湖而建“数据服务环”,环上的服务包括了数仓、…...
51单片机 跑马灯
#include <reg52.h>//毫秒级延时函数 void delay(int z) {int x,y;for(x z; x > 0; x--)for(y 114; y > 0 ; y--); }sbit LED1 P1^0x0; sbit LED2 P1^0x1; sbit LED3 P1^0x2; sbit LED4 P1^0x3; sbit LED5 P1^0x4; sbit LED6 P1^0x5; sbit LED7 P1^0x6; s…...
迎新年年终总结
迎新年年终总结 1、除夕迎新年登高有感 1、除夕迎新年登高有感 除旧岁,迎新年。凭栏立,意阑珊。 天空阔,世道艰。唯自强,可彼岸。 于2024年2月9日 10:51。...
一台服务器可以支持多少TCP连接
前言 在linux系统中一切皆文件,每当有一个tcp连接建立,那么就会打开一个文件描述符。在Linux系统中,文件描述符打开的个数是有限制的,当超过这个限制的时候内核就会跑出too many open files异常。 linux上能打开的最大文件…...
svg基础(六)滤镜-图像,光照效果(漫反射,镜面反射),组合
1 feImage:图像滤镜 feImage 滤镜从外部来源取得图像数据,并提供像素数据作为输出(意味着如果外部来源是一个 SVG 图像,这个图像将被栅格化。) 1.1 用法: <feImage x"" y"" width"&quo…...
电脑数据误删如何恢复?9 个Windows 数据恢复方案
无论您是由于软件或硬件故障、网络犯罪还是意外删除而丢失数据,数据丢失都会带来压力和令人不快。 如今的企业通常将其重要数据存储在云或硬盘上。但在执行其中任何一项操作之前,您很有可能会丢失数据。 数据丢失的主要原因是意外删除,任何…...
【doghead】uv_loop_t的创建及线程执行
worker测试程序,类似mediasoup对uv的使用,是one loop per thread 。创建一个UVLoop 就可以创建一个uv_loop_t Transport 创建一个: 试验配置创建一个: UvLoop 封装了libuv的uv_loop_t ,作为共享指针提供 对uv_loop_t 创建并初始化...
云计算运营模式介绍
目录 一、云计算运营模式概述 1.1 概述 二、云计算服务角色 2.1 角色划分 2.1.1 云服务提供商 2.1.2 云服务消费者 2.1.3 云服务代理商 2.1.4 云计算审计员 2.1.5 云服务承运商 三、云计算责任模型 3.1 云计算服务模式与责任关系图 3.2 云计算服务模式与责任关系解析…...
物资捐赠管理系统
文章目录 物资捐赠管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目(9.9¥带走) 物资捐赠管理系统 一、项目演示 爱心捐赠系统 二、项目介绍 基于springboot的爱心捐赠管理系统 开发语言:…...
YOLOv8改进 | 检测头篇 | 独创RFAHead检测头超分辨率重构检测头(适用Pose、分割、目标检测)
一、本文介绍 本文给大家带来的改进机制是RFAHead,该检测头为我独家全网首发,本文主要利用将空间注意力机制与卷积操作相结合的卷积RFAConv来优化检测头,其核心在于优化卷积核的工作方式,特别是在处理感受野内的空间特征时。RFAConv主要的优点就是增加模型的特征提取能力,…...
私有化部署一个吃豆人小游戏
目录 效果 安装步骤 1.安装并启动httpd 2.下载代码 3.启动httpd 使用 效果 安装步骤 1.安装并启动httpd yum -y install httpd 2.下载代码 进入目录 cd /var/www/html/ 下载 git clone https://gitee.com/WangZhe168_admin/pacman-canvas.git 3.启动httpd syste…...
社区店经营管理新思路:提升业绩的秘诀
作为一名资深的鲜奶吧创业者,我深知在社区经营一家店铺所面临的挑战与机遇。经过5年的探索与实践,我总结出了一套提升社区店业绩的秘诀,今天就和大家分享一下。 一、明确目标客户群体,精准定位 在社区开店,首先要明确…...