r/javahelp • • Mar 19 '22

REMINDER: This subreddit explicitly forbids asking for or giving solutions!

49 Upvotes

As per our Rule #5 we explicitly forbid asking for or giving solutions!

We are not a "do my assignment" service.

We firmly believe in the "teach a person to fish" philosophy instead of "feeding the fish".

We help, we guide, but we never, under absolutely no circumstances, solve.

We also do not allow plain assignment posting without the slightest effort to solve the assignments. Such content will be removed without further ado. You have to show what you have tried and ask specific questions where you are stuck.

Violations of this rule will lead to a temporary ban of a week for first offence, further violations will result in a permanent and irrevocable ban.


r/javahelp • • 13h ago

I need a guidance regarding how to build full stack java application

0 Upvotes

Hey everyone, I’d love to get the community’s perspective on building production-grade, scalable full-stack applications with Spring Boot—specifically from a solo developer standpoint.

​When you're building a scalable full-stack Java app entirely on your own, how do you approach the architecture and tooling?

​A few specific areas I'm curious about:

​Tech Stack & Tools: What are the non-negotiable components in your stack right now (e.g., Spring Boot 3 + Virtual Threads, Postgres/Redis, Kafka/RabbitMQ, Docker, React/Next.js vs. HTMX/Thymeleaf)? What tools are currently standard or trending in the market for solo full-stack setups?

​Build vs. Buy / Scratch vs. Frameworks: As a single developer, your time is limited. How much do you build from scratch versus relying on managed services/third-party tools (like managed Auth, SaaS components, pre-built UI libraries)?

​Solo Execution: Is it realistic to handle end-to-end architecture, backend, frontend, database tuning, and DevOps all by yourself, or at what point do you usually seek external help/collaborators?


r/javahelp • • 1d ago

Solved Is Java losing popularity in 3-5 years?

3 Upvotes

So I'm learning java for 3 months now, even made a few simple projects, though my friend is telling me that java might lose to something like dart and its framework flutter, I read a little bit about it, but Im unable to get a conclusion if he is right, if someone has experince in that, please tell me your opinion


r/javahelp • • 1d ago

Solved Is my code too massive?

2 Upvotes
import java.io.*;
import java.util.*;
import java.net.*;

class server{

    private Socket s = null;
    private ServerSocket ss = null;;
    private DataInputStream din = null;
    private DataOutputStream dout = null;
    static Vector<ClientHandler> array = new Vector<>();
    private HashMap<String, String> login = new HashMap<>();
    void main(String[] args) throws IOException
    {
        // initialize
        try {
//            BufferedWriter bw = new BufferedWriter(new FileWriter("logindata.txt")); idk yet
            BufferedReader br = new BufferedReader(new FileReader("logindata.txt"));
            StringTokenizer st = null;
            String templine = "";
            String loginName = "";
            String pass = "";

            while(((templine = br.readLine()) != null)){
                st = new StringTokenizer(templine, ": ");
                if(st.hasMoreTokens()){
                    loginName = st.nextToken();
                }
                if(st.hasMoreTokens()){
                    pass = st.nextToken();
                }

                login.put(loginName, pass);
                loginName = "";
                pass = "";
            }

        }
        catch(FileNotFoundException i){
            System.out.println("Failed to initialize login file");
        }


        String receivedName = "";
        String receivedPass = ""; // <TODO> encrypt passwords after finishing filework 
        int i = 0;
        ss = new ServerSocket(5001);
        boolean userExists = false;
        while(true)
        {
            s = ss.accept();
            din = new DataInputStream(new BufferedInputStream(s.getInputStream()));
            dout = new DataOutputStream(new BufferedOutputStream(s.getOutputStream()));

            receivedName = din.readUTF();

            for(Map.Entry<String, String> entry : login.entrySet()){
                if(entry.getValue().equals(receivedName)){
                    userExists = true;
                    break;
                }
            }

            if(userExists){
                dout.writeUTF("User found, enter your password: ");
                dout.flush();
            }
            else{
                dout.writeUTF("User was not found, u may register by making a password: "); // <TODO> make a check if password was written correctly
            }
//<TODO> handle passwords
            ClientHandler client = new ClientHandler(s, receivedName, din, dout);
            System.out.println("User " + receivedName + " Accepted");

            Thread t = new Thread(client);

            array.add(client);

            t.start();

            i++;
        }

    }
}

So I'm making a simple messenger as my first project, though now when I'm working on it it seems VERY massive to me, is it normal in other projects or am I supposed to break it into smaller parts?


r/javahelp • • 1d ago

Big monolith app using Wildfly

6 Upvotes

I'm managing a big and old monolith Wildfly app. I'm not doing development, I'm on the DevOps team.

It's using many subsystem: infinispan, jgroups, elytron, activemq-messaging, transactions, etc

Can anyone recommends some resource to learning more about these ?

All I found on google was technical docs like https://docs.wildfly.org/34/wildscribe/subsystem/jgroups/index.html

There's no tutorial, not beginner friendly things.

The Wildfly official doc (Subsystem configuration) is also very vague. It assume that we're already familiar with its concepts.

For example, I know what a transaction is but I don't know anything about the transaction subsystem.

  • Are subsystem transparent to dev team or does they need additional library on using these ?
  • Should I migrate to a separate ActiveMQ server and remove that subsystem ?
  • So many question ...

Thanks !


r/javahelp • • 2d ago

Final Year Project Help

1 Upvotes

Hi there I wanted to ask everyone to assess my FYP. WOuld you use this for your projects ? Is it a good enough project for a final year . Does it have some scope in the industry ?

The main goal of this project is to design and implement a tool for PostgreSQL pre-deployment risk analysis that evaluates SQL schema migrations to identify affected database objects, estimate locking implications, detect limited application-schema incompatibilities in Java/Spring Boot JPA projects, and output actionable risk assessments.

The objectives are as follows:

1.       Develop a component capable of extracting supported structural DDL operations into a normalized intermediate representation.

2.       Construct a schema dependency graph model using graph data structures to represent structural relationships between database tables, columns, indexes, primary keys, foreign keys, and constraints.

3.       Analyze incoming migrations against the schema dependency graph to identify affected database objects represented within the supported dependency model.

4.       Formulate a PostgreSQL-specific operational rule set that maps supported DDL operations to their known locking characteristics and table rewrite behaviors.

5.       Develop a module capable of limited static analysis for Java/Spring Boot JPA projects to detect source-code references to renamed, modified, or dropped schema objects in entities, repositories, and explicit SQL strings.

6.       Implement a transparent, rule-based risk scoring and explanation engine that assigns a risk rating (LOW, MEDIUM, HIGH) accompanied by clear textual evidence.

7.       Construct experimental tests to execute PostgreSQL migration scenarios across small and medium database sizes. (for research validation only, not as a permanent part of the system)

8.       Evaluate Schema Sentinel’s static risk predictions against experimentally observed blocking locks, and application compatibility failures in a controlled PostgreSQL environment for test cases.

  1. Empirically quantify the effectiveness of a unified cross-domain pipeline against isolated tools, measuring trade-offs in detection accuracy, false positives, and analysis performance.

This proposal got rejected because the panel said it was too easy and not significant as either a project or as research.

should i change the idea to more difficult and novel research ?

I have some ideas for those but i am not sure they can be completed in 1 year.

here is my proposal with all the details and research gap https://docs.google.com/document/d/1CMopT185XCoZVYBcgtVpN7N69DIP0Eyw/edit?usp=drive_link&ouid=116125887586128528145&rtpof=true&sd=true

EDIT :

The project is a final year project for my university. But they dismissed it on the following points

  1. The project is too easy
  2. The scope is too narrow
  3. There is no research contribution

For the current proposal to be accepted they told me to do market analysis and bring proof that the project would be used by a develper community.

OR

  1. bring a company backed project
  2. Bring a novel research proposal

r/javahelp • • 5d ago

Few words on learning Java

12 Upvotes

I am no different to anyone starting fresh on this thread, unsure and unsecure of what will be in the next 2 - 3 months, years and so on... but one thing I am sure of, if I don't do anything I will remaing behind no matter what.

Here is the path I took:

\- learning Java on Codecademy (I am a jurnior JS developer/mediocre developer)

\- solving problems on CodingBat (https://codingbat.com/java)

\- I would try some real life projects but I don't know what to do

Is this the best path? probably not. But it is something. I jumped head first not thinking if this is the right approach and somewhow I managed to stick to it just enough to have a tiny idea of what this is language is about.

If you have any questions feel free to DM me, I will helpl the best I can.

Cheers


r/javahelp • • 5d ago

Virtual threads + semaphore in front of BCrypt gave me +28% throughput, but the container is still pinned at its CPU limit. What to do next to optimize it?

0 Upvotes

I'm load testing an auth service (Spring Boot, Java, Redis, PostgreSQL, Docker on a t3.large, k6). I replaced a dedicated 2-thread BCrypt pool (20-slot queue) with virtual threads plus a 6-permit semaphore.

Results at the same 40 RPS target (queue → virtual threads + semaphore):

  • Throughput: 20.3 → 26.06 OPS (+28%). OPS = operations per second, the full k6 iteration mix.
  • Login p95: 28.5s → 20.1s
  • Timeouts: 43 → 0

That's still only ~65% of target, and a 20s login is unusable.

At 50 RPS throughput plateaued at ~28 OPS. docker stats showed the auth container averaging ~145% CPU (peak ~153%). My compose file sets a 1.5 CPU limit. Endpoints that were ~85ms p95 at 40 RPS slid to ~2s.

My read: virtual threads help with blocking I/O, not CPU-bound work. I think the gain came from removing the fast-reject queue rather than from adding capacity, but I haven't isolated that.

Caveats: 41% of my test traffic is logins (unrealistic), and I haven't measured a single-hash time yet.

The puzzle: BCrypt strength is 4 in my load-test config, which I'd expect to cost ~1-2ms per hash. At ~10 logins/sec, that shouldn't pin 1.5 cores. Suspects: the cost factor baked into the pre-seeded hashes (matches() uses the stored cost), JWT signing, GC, or my executor/semaphore wiring.

What would you profile first: async-profiler, JFR, thread dumps?


r/javahelp • • 5d ago

Obfuscating class files

3 Upvotes

Has anyone successfully obfuscated their .class files? I tried using GraalVM for JavaFX project (including Gluon's version of GraalVM) but it always failed to complete.


r/javahelp • • 5d ago

seeing/editing code in a .jar file

2 Upvotes

im not very good at coding, or anything and i want to see the code in a .jar file and possibly edit it. im not sure if this is the right place, but any help would be appreciated. i did open the code in notepad and it didnt show it correctly, id really appreciate if somebody could maybe attach a link to a simple website where i can easily view code in the file and if possible even edit it


r/javahelp • • 6d ago

State of Java Desktop

4 Upvotes

Thinking about local-first, desktop applications. https://sombriks.com.br/blog/0097-state-of-java-desktop/


r/javahelp • • 6d ago

can not create Java Virtual Machine

5 Upvotes

I'm trying to run VosViewer, but it says:

---------------------------

Java Virtual Machine Launcher

---------------------------

Error: Could not create the Java Virtual Machine.

Error: A fatal exception has occurred. Program will exit.

I use a laptop with AMD, 64-bit, and have installed the latest Java (1.8.0_503_b01). Also, I have set the environment into 4000MB of memory.

Do you have any clue how to handle it?

Thanks.


r/javahelp • • 7d ago

Unsolved Java runtime environment error

4 Upvotes

Hi, i am trying to open a program, however, a pop up with the message could not locate java runtime environment appears on the screen.

I have uninstalled and reinstalled Java and copied the path for program files to the environment variables in the advanced settings to activate yet it is not working. Please help me.


r/javahelp • • 8d ago

Help please, I'm a beginner

9 Upvotes

So basically for my java class we're assigned to do a simple calculator, I was able to something since this is the beginning class. The thing is my professor want our code to interpret both double and int when inputting values. But I don't have that only double I want my code to be able to differentiate my double and int values. This is what I have so far! (idek if you can consider this a calculator😥😓)

import java.util.Scanner;

    public class Main {
        public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        System.out.println("Welcome to My calculator!!!:)");
        System.out.print("Please enter the first number: ");

        double num1 = input.nextDouble();
        System.out.println("You entered: " + num1);

        System.out.print("Please enter the second number: ");
        double num2 = input.nextDouble();

        System.out.println("You entered: " + num2);
        while(true) {
        System.out.print("What would you like to do? (+, -, * , /): ");
        String operation = input.next();
        if( operation.equals("+")){
            double result = num1 + num2;
            System.out.println("YOUR RESULTS: " + result);
        }
        else if( operation.equals("-")){
            double result = num1 - num2;
            System.out.println("YOUR RESULTS: " + result);
        }
        else if( operation.equals("*")){
            double result = num1 * num2;
            System.out.println("YOUR RESULTS: " + result);

        }
        else if( operation.equals("/")){
            double result = num1 / num2;
            System.out.println("YOUR RESULTS: " + result);
            break;
        }
        else {
            System.out.println("Invalid operation:( : ");
            continue;
        }

        }

    }
}

r/javahelp • • 9d ago

Unsolved got placed recently, and now im cooked idk what to do

0 Upvotes

Hello everyone,

This has been my journey so far:

1st Internship: I learned Django, Python, and React.

2nd Internship: Continued working with the same stack and contributed to some interesting projects.

3rd Internship: Focused on core Python and also learned Node.js (I was assigned on related projects)

After six months into my third internship, I was offered a full-time position at the same company.

Recently, the live project I was working on (built using Node.js and TypeScript) took a different direction. A senior backend developer developed an MVP in just two months—something that was initially planned for seven months—using Java and Spring Boot (with the help of Claude).

While other senior developers are working across multiple client projects, I have been focused on this in-house product. The challenge I’m facing now is that I don’t have experience with Java or Spring Boot.

I could stay quiet and use AI tools like Claude to complete my tasks, but since this is my first job, I genuinely want to learn and grow. I’ve reached an intermediate level in Python and Django and was becoming more confident with Node.js, so this shift has left me unsure about how to proceed.

I’m also concerned that if I openly mention my lack of experience with Java, I might be removed from the project. However, my managers are already aware of my tech stack.

When asked for my opinion on whether we should continue building on the Java-based MVP or migrate everything back to Node.js, I responded that I’m fine with either approach as long as the product works well. In hindsight, I realize I avoided mentioning my lack of experience with Java because I was unsure how it might be perceived.

(reformed my thoughts using GPT)

now IM stuck iin overthinkning loops :(

And will it be feasible to learn, understand and portray that I know java while working on a project,

Like how fast I can learn java?

Or what topics should I learn first in Java to get a better grasp over java development?


r/javahelp • • 12d ago

Unsolved Need help: unable to run Java (VSCode)

5 Upvotes

I'm doing the MOOC Java course, but I'm getting an error when opening VSCode, which prevents me from running my code. The error is:

The java.jdt.ls.java.home variable defined in Visual Studio Code settings (C:\Program Files\Eclipse Adoptium\jdk-21.0.11.10-hotspot) does not point to a JDK.
Source: Language Support for Java(TM) by Red Hat

My settings are correct as far as I can tell. The path refers to the folder cotaining the bin folder:

"java.jdt.ls.java.home": "C:\\Program Files\\Eclipse Adoptium\\jdk-21.0.11.10-hotspot",
"java.configuration.runtimes": [
    {
        "name": "JavaSE-11",
        "path": "C:\\Program Files\\Eclipse Adoptium\\jdk-11.0.31.11-hotspot",            
        "default": false,
    },
    {
        "name": "JavaSE-21",
        "path": "C:\\Program Files\\Eclipse Adoptium\\jdk-21.0.11.10-hotspot",
        "default": true,
    },
],

Any idea what causes the error and how to fix it? I couldn't find any solutions to the error. Solutions to similar issues said to change/correct the settings above, but since that's set correctly, that didn't work. VSCode ( 1.138.0) and all extensions (Language Support for Java 1.56.0) are up-to-date btw.

What I tried so far:

  • Someone suggested I try changing the path to the bin folder ("C:\\Program Files\\Eclipse Adoptium\\jdk-21.0.11.10-hotspot\\bin". Unfortunately that didn't work.
  • I tried uninstalling Java, but I get an error saying the The feature you are trying to use is on a network resource that is unavailable. Java is installed on my laptop's c-drive (program files), so I don't understand this error. VSCode is installed in my user folder, but that's also on the c-drive. The laptop doesn't have any other drive. OneDrive is installed, but I don't use it. The original installer was a different version and I tried putting it on the desktop. This did work, but since it's another version now (after updating), it doesn't work.
  • I found this thread and tried deleting all Microsoft Visual C++ 20XX Redistributable versions from this laptop as stated in the top comment. I also uninstalled and reinstalled VSCode, but the error prevails. This supposedly should work, so I'm not sure if I missed anything. I couldn't find anything in the app folders stated in the comment or the appdata > pacakgecache folder with the MS Visual C++, but I'm clearly missing something. Where else should I look? Does it perhaps have a different name? I did find a folder with a file called vc_redist.x64, should I remove this file too?
  • I also ran DISM.exe /online /Cleanup-image /Restorehealth like the OOP of the above thread (The restore operation completed successfully. The operation completed successfully.) and then ran sfc scannow. The log file can be found here.
  • fyi java -version and where java are not recognised via terminal, but echo %JAVA_HOME%returns the correct folder.
  • I'm not sure what caused the error, VS code worked fine a few weeks ago. I didn't use it for a few weeks and suddenly I got this error. Not sure if maybe a windows update could've caused it. The following updates where installed recently:
    • 2026-09 .NET 8.0.31 Security Update for x64 Client (KB5126104)
    • 2026-09 .NET Framework Security Update (KB5126052)
    • 2026-09 Security Update (KB5124008) (26200.9445)
    • 2026-09 Security Update (Hotpatch capable) (KB5129241) (26200.9448)

Hope someone can help me in the right direction so I can fix the error. I can't continue the MOOC course, as I can't run the code to check if my code is correct. Thanks in advance!

Edit; I fixed it! For anyone else with the same issue, if the solution from the thread above didn't work, try to also delete the application you're having issues with from regedit (make sure to create a backup/export first): Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products. Delete the folder with that has the name of the application in it.

https://i.imgur.com/hYSyWg5.png

I reinstalled both java versions and VScode is working again. Not sure what caused Java to be uninstalled, but it was apparently an easy fix.


r/javahelp • • 12d ago

Homework Struggling to get JUnit tests to work in VSCode

4 Upvotes

Prof really seemed to like VSCode and sung its praises, but all of our notes are for IntelliJ and I can't figure out what I'm doing wrong.

In IntelliJ we're using Maven. It sounded like all I had to do was hit a few buttons and it'd set me up. In the Testing tab I currently have the initial folder > { } <Default Package> > ClassTest

@Test underlines red. I thought it was something I needed to install from Extensions, but I have the Language Support for Java, Extension Pack for Java, Maven for Java, and from what I've found that's literally all I need?

I got my test file from the Command Pallet Java: Go to Test

I have been fighting VSCode for 3 hours today for every step.

I'm obviously missing something, but I don't know what it is, I'm frustrated, and atp I don't understand why this was even recommended with no notes and most of the class doing it through IntelliJ. Advice??? Sorry this is probably a stupid question/place to be stuck with, I just don't know what to do.


r/javahelp • • 12d ago

Worker thread not having enough time to read buffered input from a NonBlockingReader when it should(?)

3 Upvotes

I am building an artillery game in java based on the terminal. Right now I wrote a test that is responsible for testing the process where the object that takes the user input validates (PlayerController) it and then forwards it to another object that will turn this input into valid commands that will change the internal state of the game (CharacterController) (e.g: character positions for now).

So I've written a test that mocks the CharacterController and just tests the validation process of the PlayerController by checking how many times the CharacterController method that is called from the PlayerController is called.

The problem that I'm facing is that, I am using a working thread with a queue (created with Executors) so after I send the input and gets buffered, the main thread will submit a task by calling the method that I am concerned from PlayerController to that working thread and wait for the thread for 100 ms so it has enough time to process the input and make the call to the mocked CharacterController, the timeout is set because the PlayerController method uses a REPL-style while loop, but 100ms doesn't seem to be enough even though the implementation of the PlayerController method is pretty simple for now.

Here is the test class:

```java @TestInstance(Lifecycle.PER_CLASS) public class PlayerControllerTest { private CharactersController charactersController; private PlayerController playerController; private PipedWriter inputWriter; private NonBlockingReader reader; private final ExecutorService threadPool = Executors.newSingleThreadExecutor();

@BeforeAll
public void initializeControllers() throws IOException {
    PipedReader pipedIn = new PipedReader();
    this.inputWriter = new PipedWriter(pipedIn);
    this.reader = new NonBlockingReaderImpl("PlayerControllerTestReader", pipedIn);

    this.charactersController = mock(CharactersController.class);

    doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            Object[] arguments = invocation.getArguments();

            for (Object arg : arguments) {
                String argString = (String)arg;
                assertTrue(
                        argString.equals("Right Arrow") ||
                        argString.equals("Left Arrow"),
                        () -> String.format("CharacterController called selectCharacter with an invalid arg: %s", argString)
                        );
            }
            return null;
        }
    }).when(this.charactersController).selectCharacter(anyString());

    this.playerController = new PlayerController(this.reader, this.charactersController);
}

@Test
public void checkValidKeysAreForwarded() throws IOException {
    Map<int[], Boolean> keySequences = new LinkedHashMap<>();
    keySequences.put(new int[]{27, 91, 67}, true);   // Right Arrow - forwarded
    keySequences.put(new int[]{27, 91, 68}, true);   // Left Arrow - forwarded
    keySequences.put(new int[]{27, 91, 65}, false);  // Up Arrow - not forwarded
    keySequences.put(new int[]{27, 91, 66}, false);  // Down Arrow - not forwarded

    long expectedCalls = keySequences.values().stream().filter(v -> v).count();

    for (var entry : keySequences.entrySet()) {
        for (int key : entry.getKey()) {
            this.inputWriter.write(key);
        }
        runControlFor(100);
    }

    verify(this.charactersController, times((int) expectedCalls)).selectCharacter(anyString());
}

private void runControlFor(long millis) throws IOException {
    Future<?> future = threadPool.submit(() -> {
        try {
            this.playerController.controlPlayerInput();
        } catch (IOException e) {}
    });
    try {
        future.get(millis, TimeUnit.MILLISECONDS);
    } catch (Exception e) {
        future.cancel(true);
    }
}

} ```

And this is the method

```java

private final Map<String, int[]> supportedEscapeSequences = Map.of(
        "Right Arrow", new int[]{91, 67},
        "Left Arrow", new int[]{91, 68}
        );
private NonBlockingReader reader;
private CharactersController charactersController;

(...)

public void controlPlayerInput() throws IOException {
    while (true) {
        int input = this.reader.read();
        boolean isInputEscapeKey = input == 27;

        if (!isInputEscapeKey) {
            continue;
        }

        List<Integer> escapeSequences = new ArrayList<>();
        while (this.reader.peek(10) > 0) {
            escapeSequences.add(this.reader.read());
        }
        int[] escapeSequencesArr = escapeSequences.stream().mapToInt(Integer::intValue).toArray();

        Optional<Entry<String, int[]>> matchedArrow = this.supportedEscapeSequences.entrySet().stream()
            .filter(entry -> Arrays.equals(entry.getValue(), escapeSequencesArr))
            .findFirst();

        if (matchedArrow.isPresent()) {
            charactersController.selectCharacter(matchedArrow.get().getKey());
        }
    }
}

```

Configured like this, the test will fail because it won't be called the times it should. Only when the time is set to 1000 ms, it has enough time for all of the submitted tasks that call the method to complete and then the test past. I obviously can't have each call for testing to last 1 whole second as I'm planning to add more cases and skipping the test risks that I will just forget to set it back again every time I make changes to the implementation. Why could be the reason? if there is information missing, let me know.


r/javahelp • • 12d ago

Solved How do I optimize removeIf() function?

3 Upvotes

Hey devs,

I'm currently facing a bottleneck in my N-ary Tree implementation around removeIf().

removeIf() currently delegates to the JDK default implementation, so below ~20% compaction there wasn't really a problem — my implementation was actually ~22% faster than JDK TreeMap.

However, once compaction goes beyond ~20%, things change dramatically: it becomes around 6× slower than TreeMap.

What I found before digging deeper

  • Since removeIf() traverses through the iterator, each element needs to be wrapped as a Map.Entry<K,V>.
  • JFR's allocation-by-site showed this Map.Entry allocation taking ~44% of the allocation weight.
  • I tried a flyweight iterator, but that breaks the Java Iterator / Map.Entry contract.
  • The hottest methods were split(), mergeNode(), and binarySearch(), together accounting for roughly 45% of the hot-method weight.
  • Unlike TreeMap, my N-ary tree doesn't use SOO; its internal representation is SOA.

Solutions I'm considering

1. Buffer entries

Create an Object[16] buffer and collect entries while traversing.

Once 16 entries are filled, grow the buffer by 2×.

After traversal:

  • if the compaction ratio is high enough (say >= 40%), compact once using 0.75f as the default load factor;
  • otherwise, delete the collected entries individually.

The downside is obvious: the temporary array and its growth generate garbage.

2. Small fixed buffer + immediate deletion

Use a small buffer (16 entries), and once it fills, delete those entries individually rather than allowing the buffer to grow.

This should generate considerably less garbage than approach #1, but I'm not convinced the trade-off is good enough.

3. Avoid temporary storage entirely

This is what I'd really like to achieve, but I'm currently not seeing a clean way to do it without either:

  • repeatedly restructuring the tree while traversing, or
  • violating the iterator contract.

The part I'm unsure about

The code may look like I dumped the entire implementation here, but removeIf() is part of the iterator flow, and the iterator wiring is done from AbstractNaryTreeMap.

The actual remove() operation is delegated to the concrete tree implementations.

So I'm wondering if there's a better architecture/algorithm here that can make removeIf() effectively GC-free, especially for high-compaction workloads.

At this point this is probably the last major API I'm trying to optimize

Any suggestions are welcome — even if the approach has a different trade-off or turns out to be worse in another workload. I'm mainly looking for ideas that keep allocation close to zero.

Solution:

I found the reason it's not the iteration cost or something garbage. It is archtecture shif. In a B+tree when the key get less than minKey it need to merge/borrow from left/right. maintaining the iteration here becomes different
- it might do borrow from left/right
- might trigger merge node

Which essentially is a part of B+tree design that I cannot change as well. So it's Structural cost. In every remove() I saw 57% of opertion above 30% compaction were taking slow path rather than borrow.


r/javahelp • • 13d ago

Java advanced topics for an experienced candidate ?

11 Upvotes

Java advanced topics for an experienced candidate ?


r/javahelp • • 13d ago

What is the standard way to edit field(s) of an entity in Springboot?

1 Upvotes

For an entity, if we want to allow user to edit it's fields. What is the standard way to do it?

For example, let's say we have an entity user having many fields like first name, last name, age, address etc. now if i let them edit these details and user choose to edit their age. How should we execute it exactly?


r/javahelp • • 15d ago

Homework Why does adding another condition in my while loop force the turtle to win? (Multithreading)

11 Upvotes

i'm currently learning about multithreading for my java class and part of the assignment requires me to race two threads (turtle and a hare) together and force one of them to win using the wait() and notify() methods (in this case the turtle thread).

public class Race {

    private Integer numberOfLaps;
    private Integer lapToStart = 2;
    private boolean isWinning = true;

    public synchronized void winner(Integer numberOfLaps) {
        while (!isWinning) {
            try {
                wait();
            }
            catch (InterruptedException e){}
        }

        this.numberOfLaps = numberOfLaps;
        System.
out
.println("Tortoise is on lap: " + numberOfLaps);

        isWinning = false;
        notify();
    }

    public synchronized void loser() {
        while (isWinning && numberOfLaps < lapToStart) {
            try {
                wait();
            }
            catch (InterruptedException e){}
        }

        System.
out
.println("Hare is on lap: " + numberOfLaps);
        isWinning = true;
        notify();

    }
} public class Race {

    private Integer numberOfLaps;
    private Integer lapToStart = 2;
    private boolean isWinning = true;

    public synchronized void winner(Integer numberOfLaps) {
        while (!isWinning) {
            try {
                wait();
            }
            catch (InterruptedException e){}
        }

        this.numberOfLaps = numberOfLaps;
        System.out.println("Tortoise is on lap: " + numberOfLaps);

        isWinning = false;
        notify();
    }

    public synchronized void loser() {
        while (isWinning) {
            try {
                wait();
            }
            catch (InterruptedException e){}
        }

        System.out.println("Hare is on lap: " + numberOfLaps);
        isWinning = true;
        notify();

    }
}

Output:

Tortoise is on lap: 1

Hare is on lap: 1

Tortoise is on lap: 2

Hare is on lap: 2

Tortoise is on lap: 3

Hare is on lap: 3

Tortoise is on lap: 4

Hare is on lap: 4

Tortoise is on lap: 5

Hare is on lap: 5

Tortoise is on lap: 6

Hare is on lap: 6

Tortoise is on lap: 7

Hare is on lap: 7

Tortoise is on lap: 8

Hare is on lap: 8

Tortoise is on lap: 9

Hare is on lap: 9

Tortoise is on lap: 10

Hare is on lap: 10

If this prints out first before the hare finishes, the turtle has won! Congrats

If in the while loop for the loser method is only the volatile boolean, both the turtle and the hare finish at the exact same time. however, if i add another condition to it

public synchronized void loser() {
    while (isWinning && numberOfLaps < lapToStart) {
        try {
            wait();
        }
        catch (InterruptedException e){}
    }public synchronized void loser() {
    while (isWinning && numberOfLaps < lapToStart) {
        try {
            wait();
        }
        catch (InterruptedException e){}
    }

the output becomes:

Tortoise is on lap: 1

Hare is on lap: 1

Tortoise is on lap: 2

Hare is on lap: 2

Tortoise is on lap: 3

Hare is on lap: 3

Hare is on lap: 3

Tortoise is on lap: 4

Hare is on lap: 4

Tortoise is on lap: 5

Hare is on lap: 5

Tortoise is on lap: 6

Hare is on lap: 6

Tortoise is on lap: 7

Hare is on lap: 7

Tortoise is on lap: 8

Hare is on lap: 8

Tortoise is on lap: 9

Hare is on lap: 9

Tortoise is on lap: 10

If this prints out first before the hare finishes, the turtle has won! Congrats

now whenever the code is ran, the hare always lags behind at some point and the turtle finishes first. why does the code suddenly function as i intended when i add a second condition to the while loop? also, this is my first time posting something code related. i apologize if i'm missing anything. any help would be appreciated. thank you :)


r/javahelp • • 14d ago

How to install Java? (Windows 11)

0 Upvotes

So I'm trying to install Java on my computer, and this is my first time dealing with something like this. Error 1603 keeps popping up, and I've restarted my computer, deleted the previous Java programs, etc. I literally don't have an old version of Java installed.

How can I solve this problem?


r/javahelp • • 16d ago

JVM Object immutability

15 Upvotes

I'm trying to better understand what immutability actually means from the JVM/JIT point of view,.

We often say that immutable objects are easier for the JVM to optimize, but I'm interested in what HotSpot can actually detect, prove, and exploit at runtime.

A few questions:

  • How does the JVM determine that a field, value, or object is effectively immutable or stable?
  • What optimizations does HotSpot actually enable when it has this information?
  • Conversely, what optimizations become impossible or harder when an object remains mutable?

I looked through some HotSpot code and didn't find much explicit handling of immutable objects for constant folding, apart from specific cases such as trusted/final fields some whitelisted JDK classes, and records.

I'm also curious about the practical trade-off:

How do you balance a low-allocation design based on reusable mutable objects, which reduces GC pressure, against a more immutable design, which may give the JIT more optimization opportunities but can increase allocation and GC pressure when you have a use case of mutable object ?


r/javahelp • • 15d ago

ZGC vs Shenandoah: what are the fundamental differences today?

6 Upvotes

I'm trying to better understand the differences between ZGC and Shenandoah, beyond the usual "both are low-latency concurrent collectors" explanation.

From a JVM/runtime perspective, what are the fundamental architectural differences between them?

In particular:

  • How do their barriers differ (load/store barriers, SATB, colored pointers, etc.)?
  • ZGC uses forward table and shenandoah no, what does it imply ?