Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OOM Java heap space on start up #11

Open
hsrinara opened this issue Mar 27, 2020 · 7 comments
Open

OOM Java heap space on start up #11

hsrinara opened this issue Mar 27, 2020 · 7 comments

Comments

@hsrinara
Copy link

Hi @nikitabobko, when launching the application I see this exception below. Is there a way to increase the heap space for your application?

	at java.base/java.util.Arrays.copyOf(Arrays.java:3745)
	at java.base/java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:172)
	at java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:633)
	at java.base/java.lang.StringBuffer.append(StringBuffer.java:392)
	at java.base/java.io.StringWriter.write(StringWriter.java:122)
	at com.google.gson.stream.JsonWriter.string(JsonWriter.java:590)
	at com.google.gson.stream.JsonWriter.value(JsonWriter.java:418)
	at com.google.gson.internal.bind.TypeAdapters$16.write(TypeAdapters.java:406)
	at com.google.gson.internal.bind.TypeAdapters$16.write(TypeAdapters.java:390)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.ArrayTypeAdapter.write(ArrayTypeAdapter.java:95)
	at com.google.gson.Gson.toJson(Gson.java:704)
	at com.google.gson.Gson.toJson(Gson.java:683)
	at com.google.gson.Gson.toJson(Gson.java:638)
	at com.google.gson.Gson.toJson(Gson.java:618)
	at ru.nikitabobko.gcalnotifier.support.JsonUserDataManager.safe(UserDataManager.kt:68)
	at ru.nikitabobko.gcalnotifier.support.JsonUserDataManager.safeEventsList(UserDataManager.kt:47)
	at ru.nikitabobko.gcalnotifier.support.JsonUserDataManager.safe(UserDataManager.kt:43)
	at ru.nikitabobko.gcalnotifier.controller.ControllerImpl$refresh$1.invoke(Controller.kt:146)
	at ru.nikitabobko.gcalnotifier.controller.ControllerImpl$refresh$1.invoke(Controller.kt:71)
	at ru.nikitabobko.gcalnotifier.support.GoogleCalendarManagerImpl$getUpcomingEventsAsync$1.invoke(GoogleCalendarManager.kt:85)
	at ru.nikitabobko.gcalnotifier.support.GoogleCalendarManagerImpl$getUpcomingEventsAsync$1.invoke(GoogleCalendarManager.kt:43)
	at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)
@nikitabobko
Copy link
Owner

Thank you for your report! It's good to know that in some cases current heap size is not enough. You can change heap size in /usr/bin/gcal-notifier-kotlin-gtk

@hsrinara
Copy link
Author

It seems to fail in the implementation of the gson bit when converting to json. I wonder whether there is a mechanism to stream the json out bit by bit.

Perhaps the UserDataManager.safeEventsList can be made to write each element one by one.

@hsrinara
Copy link
Author

and just FYI, when I bumped the memory, I managed to write the events file:

-rw-rw-r-- 1 hsrinara hsrinara 600K Mar 27 09:19 /home/hsrinara/.config/gcal-notifier-kotlin-gtk/events.json

And just confirmed I now have the events popping up on my screen. Thanks for your fast response @nikitabobko

nikitabobko added a commit that referenced this issue Mar 29, 2020
This commit is addressed to #11. Potential OOM fix
@nikitabobko
Copy link
Owner

Can I ask you to try 2.0.9-SNAPSHOT version (or you can build SNAPSHOT by yourself from master branch). I've applied your suggestion to use stream to work with Gson and want to know whether it helps in your case. Thanks!

@hsrinara
Copy link
Author

	at java.base/java.util.Arrays.copyOfRange(Arrays.java:4030)
	at java.base/java.lang.StringLatin1.newString(StringLatin1.java:715)
	at java.base/java.lang.String.substring(String.java:1846)
	at com.google.api.client.util.DateTime.parseRfc3339(DateTime.java:315)
	at com.google.api.client.util.Data.parsePrimitiveValue(Data.java:439)
	at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:859)
	at com.google.api.client.json.JsonParser.parse(JsonParser.java:472)
	at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:781)
	at com.google.api.client.json.JsonParser.parseArray(JsonParser.java:648)
	at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:740)
	at com.google.api.client.json.JsonParser.parse(JsonParser.java:472)
	at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:781)
	at com.google.api.client.json.JsonParser.parse(JsonParser.java:382)
	at com.google.api.client.json.JsonParser.parse(JsonParser.java:355)
	at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:87)
	at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81)
	at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:459)
	at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
	at ru.nikitabobko.gcalnotifier.support.GoogleCalendarManagerImpl.getUpcomingEvents(GoogleCalendarManager.kt:69)
	at ru.nikitabobko.gcalnotifier.support.GoogleCalendarManagerImpl.access$getUpcomingEvents(GoogleCalendarManager.kt:43)
	at ru.nikitabobko.gcalnotifier.support.GoogleCalendarManagerImpl$getUpcomingEventsAsync$1.invoke(GoogleCalendarManager.kt:82)
	at ru.nikitabobko.gcalnotifier.support.GoogleCalendarManagerImpl$getUpcomingEventsAsync$1.invoke(GoogleCalendarManager.kt:43)
	at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)

@hsrinara
Copy link
Author

Apologies for the terse response, I was swamped this morning. Responding from mobile so my analysis might be a little wrong.

Couple of thoughts.

  • It appears to be throwing when loading the events from disk now.

  • I don't know gtk or the UI framework you have used so don't know if a blocking call is necessary but this API on View here is a problem for our memory issue. It forces you collect up all events to be passed to the UI later. If you can change this API to have a stream of events somehow, then that's one way to fix this. However, I suspect the UI widgets won't expose a steaming API.
    fun​ ​update​(​events​:​ ​List​<​MyEvent​>).

  • Another approach is to do an n way merge sort with files as your external buffer so you don't need to load everything into memory. If you notice, in the UI layer most events are dropped anyway because it's beyond the maximum number of events to render configuration. This solution would also require that filtering to be done on the backend after the n way merge sort. Then the call to the view is very small. That's probably the solution I would go for.

@hsrinara
Copy link
Author

Another approach would be to do the sorting and filtering onto the Google calendar backend if it supports those functions so not as much is retrieved.

nikitabobko added a commit that referenced this issue Sep 15, 2021
This commit is addressed to #11. Potential OOM fix
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants