diff --git a/plugins/global/nvidia/nvidia.cpp b/plugins/global/nvidia/nvidia.cpp
index 8afaead1..26eb790d 100644
--- a/plugins/global/nvidia/nvidia.cpp
+++ b/plugins/global/nvidia/nvidia.cpp
@@ -21,6 +21,8 @@
 
 #include <QDateTime>
 #include <QProcess>
+#include <QTimer>
+#include <QUuid>
 #include <QStandardPaths>
 
 #include <KPluginFactory>
@@ -31,6 +33,7 @@
 
 class GPU : public SensorObject
 {
+    Q_OBJECT
 public:
     GPU(int index, SensorContainer *parent);
     ~GPU() = default;
@@ -38,16 +41,51 @@ public:
     SensorProperty *tempProperty() const { return m_temp; }
     SensorProperty *sharedMemory() const { return m_sm; }
     SensorProperty *memory() const { return m_mem; }
+    SensorProperty *memory_alloc() const { return m_memory_alloc; };
     SensorProperty *encoder() const { return m_enc; }
     SensorProperty *decoder() const { return m_dec; }
     SensorProperty *memoryClock() const { return m_memClock; }
     SensorProperty *processorClock() const { return m_processorClock; }
 
+public slots:
+    void update_memory_alloc() {
+        auto const sniExecutable = QStandardPaths::findExecutable("nvidia-smi");
+        if (sniExecutable.isEmpty()) {
+            return;
+        }
+
+        m_process_alloc= new QProcess(this);
+        m_process_alloc->setProgram(sniExecutable);
+        m_process_alloc->setArguments({QStringList()
+            << "-i"
+            << QString{"%1"}.arg(index)
+            << "--query-gpu=memory.total,memory.used"
+            << "--format=csv,noheader,nounits"});
+
+        connect(m_process_alloc, &QProcess::readyReadStandardOutput, this, [=]() {
+            if (m_process_alloc->canReadLine()) {
+                QString const line= m_process_alloc->readLine();
+                auto const parts= line.split(",", Qt::SkipEmptyParts);
+                auto total= parts[0].toFloat();
+                auto used= parts[1].toFloat();
+                this->memory_alloc()->setValue(int(used/total*100));
+                m_process_alloc->terminate();
+                m_process_alloc->deleteLater();
+            }
+        });
+
+        m_process_alloc->start();
+    };
+
 private:
+    QTimer* timer;
+    QProcess *m_process_alloc;
+
     SensorProperty *m_pwr;
     SensorProperty *m_temp;
     SensorProperty *m_sm;
     SensorProperty *m_mem;
+    SensorProperty *m_memory_alloc;
     SensorProperty *m_enc;
     SensorProperty *m_dec;
     SensorProperty *m_memClock;
@@ -59,6 +97,11 @@ GPU::GPU(int index, SensorContainer *parent)
 {
     auto displayIndex = index + 1;
 
+    timer= new QTimer();
+    timer->setInterval(1000);
+    timer->connect(timer, &QTimer::timeout, this, &GPU::update_memory_alloc);
+    timer->start();
+
     m_pwr = new SensorProperty(QStringLiteral("power"), this);
     m_pwr->setName(i18nc("@title", "GPU %1 Power Usage", displayIndex));
     m_pwr->setShortName(i18nc("@title GPU Power Usage", "Power"));
@@ -83,6 +126,12 @@ GPU::GPU(int index, SensorContainer *parent)
     m_mem->setUnit(KSysGuard::UnitPercent);
     m_mem->setVariantType(QVariant::UInt);
 
+    m_memory_alloc = new SensorProperty(QStringLiteral("memory alloc"), this);
+    m_memory_alloc->setName(i18nc("@title", "GPU %1 Memory Alloc", displayIndex));
+    m_memory_alloc->setShortName(i18nc("@title GPU Memory Alloc", "Memory Alloc"));
+    m_memory_alloc->setUnit(KSysGuard::UnitPercent);
+    m_memory_alloc->setVariantType(QVariant::UInt);
+
     m_enc = new SensorProperty(QStringLiteral("encoderUsage"), this);
     m_enc->setName(i18nc("@title", "GPU %1 Encoder Usage", displayIndex));
     m_enc->setShortName(i18nc("@title GPU Encoder Usage", "Encoder"));
@@ -129,11 +178,13 @@ NvidiaPlugin::NvidiaPlugin(QObject *parent, const QVariantList &args)
 
     connect(m_process, &QProcess::readyReadStandardOutput, this, [=]() {
         while (m_process->canReadLine()) {
-            const QString line = m_process->readLine();
+            QString line = m_process->readLine();
             if (line.startsWith(QLatin1Char('#'))) {
                 continue;
             }
-            const QVector<QStringRef> parts = line.splitRef(QLatin1Char(' '), Qt::SkipEmptyParts);
+            line.replace('-', '0');
+            line= line.trimmed();
+            const QVector<QStringRef> parts = line.splitRef(QRegExp(" +"), Qt::SkipEmptyParts);
 
             // format at time of writing is
             // # gpu   pwr gtemp mtemp    sm   mem   enc   dec  mclk  pclk
